1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-07-20 12:45:50 +03:00
occt/src/AdvApp2Var/AdvApp2Var_Iso.cxx
abv 0797d9d30a 0025418: Debug output to be limited to OCC development environment
Macros ending on "DEB" are replaced by OCCT_DEBUG across OCCT code; new macros described in documentation.
Macros starting with DEB are changed to start with "OCCT_DEBUG_".
Some code cleaned.
2014-11-05 16:55:24 +03:00

604 lines
16 KiB
C++

// Created on: 1996-07-02
// 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.
#include <AdvApp2Var_Iso.ixx>
#include <TColStd_HArray1OfInteger.hxx>
#include <TColStd_HArray2OfReal.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <gp_Pnt.hxx>
#include <AdvApp2Var_ApproxF2var.hxx>
//=======================================================================
//function : AdvApp2Var_Iso
//purpose :
//=======================================================================
AdvApp2Var_Iso::AdvApp2Var_Iso() :
myType(GeomAbs_IsoU),
myConstPar(0.5),
myU0(0.),
myU1(1.),
myV0(0.),
myV1(1.),
myPosition(0),
myExtremOrder(2),
myDerivOrder(2),
myNbCoeff(0),
myApprIsDone(Standard_False),
myHasResult(Standard_False)
{
}
//=======================================================================
//function : AdvApp2Var_Iso
//purpose :
//=======================================================================
AdvApp2Var_Iso::AdvApp2Var_Iso(const GeomAbs_IsoType type,
const Standard_Real cte,
const Standard_Real Ufirst,
const Standard_Real Ulast,
const Standard_Real Vfirst,
const Standard_Real Vlast,
const Standard_Integer pos,
const Standard_Integer iu,
const Standard_Integer iv) :
myType(type),
myConstPar(cte),
myU0(Ufirst),
myU1(Ulast),
myV0(Vfirst),
myV1(Vlast),
myPosition(pos),
myNbCoeff(0),
myApprIsDone(Standard_False),
myHasResult(Standard_False)
{
if (myType==GeomAbs_IsoU) {
myExtremOrder = iv;
myDerivOrder = iu;
}
else {
myExtremOrder = iu;
myDerivOrder = iv;
}
}
//=======================================================================
//function : IsApproximated
//purpose :
//=======================================================================
Standard_Boolean AdvApp2Var_Iso::IsApproximated() const
{
return myApprIsDone;
}
//=======================================================================
//function : HasResult
//purpose :
//=======================================================================
Standard_Boolean AdvApp2Var_Iso::HasResult() const
{
return myHasResult;
}
//=======================================================================
//function : MakeApprox
//purpose :
//=======================================================================
void AdvApp2Var_Iso::MakeApprox(const AdvApp2Var_Context& Conditions,
const Standard_Real U0,
const Standard_Real U1,
const Standard_Real V0,
const Standard_Real V1,
const AdvApp2Var_EvaluatorFunc2Var& Func,
AdvApp2Var_Node& NodeBegin,
AdvApp2Var_Node& NodeEnd)
{
// fixed values
Standard_Integer NBCRMX=1, NBCRBE;
// data stored in the Context
Standard_Integer NDIMEN, NBSESP, NDIMSE;
NDIMEN = Conditions.TotalDimension();
NBSESP = Conditions.TotalNumberSSP();
// Attention : works only in 3D
NDIMSE = 3;
// the domain of the grid
Standard_Real UVFONC[4];
UVFONC[0] = U0;
UVFONC[1] = U1;
UVFONC[2] = V0;
UVFONC[3] = V1;
// data related to the processed iso
Standard_Integer IORDRE = myExtremOrder, IDERIV = myDerivOrder;
Standard_Real TCONST = myConstPar;
// data related to the type of the iso
Standard_Integer ISOFAV = 0,NBROOT = 0,NDGJAC = 0,NCFLIM = 1;
Standard_Real TABDEC[2];
Handle (TColStd_HArray1OfReal) HUROOT = Conditions.URoots();
Handle (TColStd_HArray1OfReal) HVROOT = Conditions.VRoots();
Standard_Real * ROOTLG=NULL;
switch(myType) {
case GeomAbs_IsoV :
ISOFAV = 2;
TABDEC[0] = myU0;
TABDEC[1] = myU1;
UVFONC[0] = myU0;
UVFONC[1] = myU1;
NBROOT = (Conditions.URoots())->Length();
if (myExtremOrder>-1) NBROOT -= 2;
ROOTLG = (Standard_Real *) &HUROOT ->ChangeArray1()(HUROOT ->Lower());
NDGJAC = Conditions.UJacDeg();
NCFLIM = Conditions.ULimit();
break;
case GeomAbs_IsoU :
ISOFAV = 1;
TABDEC[0] = myV0;
TABDEC[1] = myV1;
UVFONC[2] = myV0;
UVFONC[3] = myV1;
NBROOT = (Conditions.VRoots())->Length();
if (myExtremOrder>-1) NBROOT -= 2;
ROOTLG = (Standard_Real *) &HVROOT ->ChangeArray1()(HVROOT ->Lower());
NDGJAC = Conditions.VJacDeg();
NCFLIM = Conditions.VLimit();
break;
//#ifndef OCCT_DEBUG
//pkv f
case GeomAbs_NoneIso:
//pkv t
default:
break;
//#endif
}
// data relative to the position of iso (front or cut line)
Handle (TColStd_HArray1OfReal) HEPSAPR = new TColStd_HArray1OfReal(1,NBSESP);
Standard_Integer iesp;
switch(myPosition) {
case 0 :
for (iesp=1;iesp<=NBSESP;iesp++) {
HEPSAPR->SetValue(iesp,(Conditions.CToler())->Value(iesp,1));
}
break;
case 1 :
for (iesp=1;iesp<=NBSESP;iesp++) {
HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,1));
}
break;
case 2 :
for (iesp=1;iesp<=NBSESP;iesp++) {
HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,2));
}
break;
case 3 :
for (iesp=1;iesp<=NBSESP;iesp++) {
HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,3));
}
break;
case 4 :
for (iesp=1;iesp<=NBSESP;iesp++) {
HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,4));
}
break;
}
Standard_Real *EPSAPR
= (Standard_Real *) &HEPSAPR ->ChangeArray1()(HEPSAPR ->Lower());
// the tables of approximations
Standard_Integer SZCRB = NDIMEN*NCFLIM;
Handle (TColStd_HArray1OfReal) HCOURBE =
new TColStd_HArray1OfReal(1,SZCRB*(IDERIV+1));
Standard_Real *COURBE =
(Standard_Real *) &HCOURBE ->ChangeArray1()(HCOURBE ->Lower());
Standard_Real *CRBAPP = COURBE;
Standard_Integer SZTAB = (1+NBROOT/2)*NDIMEN;
Handle (TColStd_HArray1OfReal) HSOMTAB =
new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
Standard_Real *SOMTAB =
(Standard_Real *) &HSOMTAB ->ChangeArray1()(HSOMTAB ->Lower());
Standard_Real *SOMAPP = SOMTAB;
Handle (TColStd_HArray1OfReal) HDIFTAB =
new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
Standard_Real *DIFTAB =
(Standard_Real *) &HDIFTAB ->ChangeArray1()(HDIFTAB ->Lower());
Standard_Real *DIFAPP = DIFTAB;
Handle (TColStd_HArray1OfReal) HCONTR1 =
new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
Standard_Real *CONTR1 =
(Standard_Real *) &HCONTR1->ChangeArray1()(HCONTR1->Lower());
Handle (TColStd_HArray1OfReal) HCONTR2 =
new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
Standard_Real *CONTR2 =
(Standard_Real *) &HCONTR2->ChangeArray1()(HCONTR2->Lower());
Handle (TColStd_HArray2OfReal) HERRMAX =
new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
Standard_Real *EMXAPP = new Standard_Real[NBSESP];
Handle (TColStd_HArray2OfReal) HERRMOY =
new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
//#ifdef OCCT_DEBUG
//Standard_Real *ERRMOY =
//#endif
// (Standard_Real *) &HERRMOY->ChangeArray2()(HERRMOY ->LowerRow(),HERRMOY ->LowerCol());
Standard_Real *EMYAPP = new Standard_Real[NBSESP];
//
// the approximations
//
Standard_Integer IERCOD=0, NCOEFF=0;
Standard_Integer iapp,ncfapp,ierapp;
// Standard_Integer id,ic,ideb;
for (iapp=0;iapp<=IDERIV;iapp++) {
// approximation of the derivative of order iapp
ncfapp = 0;
ierapp = 0;
// GCC 3.0 would not accept this line without the void
// pointer cast. Perhaps the real problem is a definition
// somewhere that has a void * in it.
AdvApp2Var_ApproxF2var::mma2fnc_(&NDIMEN,
&NBSESP,
&NDIMSE,
UVFONC,
/*(void *)*/Func,
&TCONST,
&ISOFAV,
&NBROOT,
ROOTLG,
&IORDRE,
&iapp,
&NDGJAC,
&NBCRMX,
&NCFLIM,
EPSAPR,
&ncfapp,
CRBAPP,
&NBCRBE,
SOMAPP,
DIFAPP,
CONTR1,
CONTR2,
TABDEC,
EMXAPP,
EMYAPP,
&ierapp);
// error and coefficient management.
if (ierapp>0) {
myApprIsDone = Standard_False;
myHasResult = Standard_False;
goto FINISH;
}
if (NCOEFF<=ncfapp) NCOEFF=ncfapp;
if (ierapp==-1) IERCOD = -1;
// return constraints of order 0 to IORDRE of extremities
Standard_Integer ider, jpos=HCONTR1->Lower();
for (ider=0; ider<=IORDRE;ider++) {
gp_Pnt pt(HCONTR1->Value(jpos),
HCONTR1->Value(jpos+1),
HCONTR1->Value(jpos+2));
if (ISOFAV==2) {
NodeBegin.SetPoint(ider,iapp, pt);
}
else {
NodeBegin.SetPoint(iapp,ider, pt);
}
jpos+=3;
}
jpos=HCONTR2->Lower();
for (ider=0; ider<=IORDRE;ider++) {
gp_Pnt pt(HCONTR2->Value(jpos),
HCONTR2->Value(jpos+1),
HCONTR2->Value(jpos+2));
if (ISOFAV==2) {
NodeEnd.SetPoint(ider,iapp, pt);
}
else {
NodeEnd.SetPoint(iapp,ider, pt);
}
jpos+=3;
}
// return errors
for (iesp=1; iesp<=NBSESP;iesp++) {
HERRMAX->SetValue(iesp,iapp+1,EMXAPP[iesp-1]);
HERRMOY->SetValue(iesp,iapp+1,EMYAPP[iesp-1]);
}
// passage to the approximation of higher order
CRBAPP += SZCRB;
SOMAPP += SZTAB;
DIFAPP += SZTAB;
}
// management of results
if (IERCOD == 0) {
// all approximations are correct
myApprIsDone = Standard_True;
myHasResult = Standard_True;
}
else if (IERCOD == -1) {
// at least one approximation is not correct
myApprIsDone = Standard_False;
myHasResult = Standard_True;
}
else {
myApprIsDone = Standard_False;
myHasResult = Standard_False;
}
if ( myHasResult ) {
myEquation = HCOURBE;
myNbCoeff = NCOEFF;
myMaxErrors = HERRMAX;
myMoyErrors = HERRMOY;
mySomTab = HSOMTAB;
myDifTab = HDIFTAB;
}
FINISH:
delete []EMXAPP;
delete []EMYAPP;
}
//=======================================================================
//function : ChangeDomain
//purpose :
//=======================================================================
void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a, const Standard_Real b)
{
if (myType==GeomAbs_IsoU) {
myV0 = a;
myV1 = b;
}
else {
myU0 = a;
myU1 = b;
}
}
//=======================================================================
//function : ChangeDomain
//purpose :
//=======================================================================
void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a,
const Standard_Real b,
const Standard_Real c,
const Standard_Real d)
{
myU0 = a;
myU1 = b;
myV0 = c;
myV1 = d;
}
//=======================================================================
//function : SetConstante
//purpose :
//=======================================================================
void AdvApp2Var_Iso::SetConstante(const Standard_Real newcte)
{
myConstPar = newcte;
}
//=======================================================================
//function : SetPosition
//purpose :
//=======================================================================
void AdvApp2Var_Iso::SetPosition(const Standard_Integer newpos)
{
myPosition = newpos;
}
//=======================================================================
//function : ResetApprox
//purpose :
//=======================================================================
void AdvApp2Var_Iso::ResetApprox()
{
myApprIsDone = Standard_False;
myHasResult = Standard_False;
}
//=======================================================================
//function : OverwriteApprox
//purpose :
//=======================================================================
void AdvApp2Var_Iso::OverwriteApprox()
{
if (myHasResult) myApprIsDone = Standard_True;
}
//=======================================================================
//function : Type
//purpose :
//=======================================================================
GeomAbs_IsoType AdvApp2Var_Iso::Type() const
{
return myType;
}
//=======================================================================
//function : Constante
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::Constante() const
{
return myConstPar;
}
//=======================================================================
//function : T0
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::T0() const
{
if (myType==GeomAbs_IsoU) {
return myV0;
}
else {
return myU0;
}
}
//=======================================================================
//function : T1
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::T1() const
{
if (myType==GeomAbs_IsoU) {
return myV1;
}
else {
return myU1;
}
}
//=======================================================================
//function : U0
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::U0() const
{
return myU0;
}
//=======================================================================
//function : U1
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::U1() const
{
return myU1;
}
//=======================================================================
//function : V0
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::V0() const
{
return myV0;
}
//=======================================================================
//function : V1
//purpose :
//=======================================================================
Standard_Real AdvApp2Var_Iso::V1() const
{
return myV1;
}
//=======================================================================
//function : UOrder
//purpose :
//=======================================================================
Standard_Integer AdvApp2Var_Iso::UOrder() const
{
if (Type()==GeomAbs_IsoU) return myDerivOrder;
else return myExtremOrder;
}
//=======================================================================
//function : VOrder
//purpose :
//=======================================================================
Standard_Integer AdvApp2Var_Iso::VOrder() const
{
if (Type()==GeomAbs_IsoV) return myDerivOrder;
else return myExtremOrder;
}
//=======================================================================
//function : Position
//purpose :
//=======================================================================
Standard_Integer AdvApp2Var_Iso::Position() const
{
return myPosition;
}
//=======================================================================
//function : NbCoeff
//purpose :
//=======================================================================
Standard_Integer AdvApp2Var_Iso::NbCoeff() const
{
return myNbCoeff;
}
//=======================================================================
//function : Polynom
//purpose :
//=======================================================================
const Handle(TColStd_HArray1OfReal)& AdvApp2Var_Iso::Polynom() const
{
return myEquation;
}
Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::SomTab() const
{
return mySomTab;
}
Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::DifTab() const
{
return myDifTab;
}
Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MaxErrors() const
{
return myMaxErrors;
}
Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MoyErrors() const
{
return myMoyErrors;
}