// 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. //==================================================================== // #10 smh 22.12.99 Protection (case of unexisting directory entry in file) // sln 21.01.2002 OCC133: Exception handling was added in method // Interface_FileReaderData::BoundEntity //==================================================================== #include #include #include #include #include #include #include #include IMPLEMENT_STANDARD_RTTIEXT(Interface_FileReaderData, Standard_Transient) // Stoque les Donnees issues d un Fichier (Conservees sous forme Litterale) // Chaque norme peut s en servir comme base (listes de parametres litteraux, // entites associees) et y ajoute ses donnees propres. // Travaille sous le controle de FileReaderTool // Optimisation : Champs pas possibles, car Param est const. Dommage // Donc, on suppose qu on lit un fichier a la fois (hypothese raisonnable) // On note en champ un numero de fichier, par rapport auquel on optimise static Standard_Integer thefic = 0; static Standard_Integer thenm0 = -1; static Standard_Integer thenp0 = -1; Interface_FileReaderData::Interface_FileReaderData(const Standard_Integer nbr, const Standard_Integer npar) : therrload(0), thenumpar(0, nbr), theents(0, nbr) { theparams = new Interface_ParamSet(npar); thenumpar.Init(0); thenm0 = -1; thenum0 = ++thefic; } Standard_Integer Interface_FileReaderData::NbRecords() const { return thenumpar.Upper(); } Standard_Integer Interface_FileReaderData::NbEntities() const { Standard_Integer nb = 0; Standard_Integer num = 0; while ((num = FindNextRecord(num)) > 0) nb++; return nb; } // .... Gestion des Parametres attaches aux Records .... void Interface_FileReaderData::InitParams(const Standard_Integer num) { thenumpar.SetValue(num, theparams->NbParams()); } void Interface_FileReaderData::AddParam(const Standard_Integer /*num*/, const Standard_CString aval, const Interface_ParamType atype, const Standard_Integer nument) { theparams->Append(aval, -1, atype, nument); } void Interface_FileReaderData::AddParam(const Standard_Integer /*num*/, const TCollection_AsciiString& aval, const Interface_ParamType atype, const Standard_Integer nument) { theparams->Append(aval.ToCString(), aval.Length(), atype, nument); } void Interface_FileReaderData::AddParam(const Standard_Integer /*num*/, const Interface_FileParameter& FP) { theparams->Append(FP); } void Interface_FileReaderData::SetParam(const Standard_Integer num, const Standard_Integer nump, const Interface_FileParameter& FP) { theparams->SetParam(thenumpar(num - 1) + nump, FP); } Standard_Integer Interface_FileReaderData::NbParams(const Standard_Integer num) const { if (num > 1) return (thenumpar(num) - thenumpar(num - 1)); else if (num == 1) return thenumpar(num); else return theparams->NbParams(); } Handle(Interface_ParamList) Interface_FileReaderData::Params(const Standard_Integer num) const { if (num == 0) return theparams->Params(0, 0); // complet else if (num == 1) return theparams->Params(0, thenumpar(1)); else return theparams->Params(thenumpar(num - 1) + 1, (thenumpar(num) - thenumpar(num - 1))); } const Interface_FileParameter& Interface_FileReaderData::Param(const Standard_Integer num, const Standard_Integer nump) const { if (thefic != thenum0) return theparams->Param(thenumpar(num - 1) + nump); if (thenm0 != num) { thenp0 = thenumpar(num - 1); thenm0 = num; } return theparams->Param(thenp0 + nump); } Interface_FileParameter& Interface_FileReaderData::ChangeParam(const Standard_Integer num, const Standard_Integer nump) { if (thefic != thenum0) return theparams->ChangeParam(thenumpar(num - 1) + nump); if (thenm0 != num) { thenp0 = thenumpar(num - 1); thenm0 = num; } return theparams->ChangeParam(thenp0 + nump); } Interface_ParamType Interface_FileReaderData::ParamType(const Standard_Integer num, const Standard_Integer nump) const { return Param(num, nump).ParamType(); } Standard_CString Interface_FileReaderData::ParamCValue(const Standard_Integer num, const Standard_Integer nump) const { return Param(num, nump).CValue(); } Standard_Boolean Interface_FileReaderData::IsParamDefined(const Standard_Integer num, const Standard_Integer nump) const { return (Param(num, nump).ParamType() != Interface_ParamVoid); } Standard_Integer Interface_FileReaderData::ParamNumber(const Standard_Integer num, const Standard_Integer nump) const { return Param(num, nump).EntityNumber(); } const Handle(Standard_Transient)& Interface_FileReaderData::ParamEntity( const Standard_Integer num, const Standard_Integer nump) const { return BoundEntity(Param(num, nump).EntityNumber()); } Interface_FileParameter& Interface_FileReaderData::ChangeParameter(const Standard_Integer numpar) { return theparams->ChangeParam(numpar); } void Interface_FileReaderData::ParamPosition(const Standard_Integer numpar, Standard_Integer& num, Standard_Integer& nump) const { Standard_Integer nbe = thenumpar.Upper(); if (numpar <= 0) { num = nump = 0; return; } for (Standard_Integer i = 1; i <= nbe; i++) { if (thenumpar(i) > numpar) { num = i; nump = numpar - thenumpar(i) + 1; return; } } num = nbe; nump = numpar - thenumpar(nbe) + 1; } Standard_Integer Interface_FileReaderData::ParamFirstRank(const Standard_Integer num) const { return thenumpar(num); } void Interface_FileReaderData::SetErrorLoad(const Standard_Boolean val) { therrload = (val ? 1 : -1); } Standard_Boolean Interface_FileReaderData::IsErrorLoad() const { return (therrload != 0); } Standard_Boolean Interface_FileReaderData::ResetErrorLoad() { Standard_Boolean res = (therrload > 0); therrload = 0; return res; } // .... Gestion des Entites Associees aux Donnees du Fichier .... const Handle(Standard_Transient)& Interface_FileReaderData::BoundEntity( const Standard_Integer num) const // { return theents(num); } { if (num >= theents.Lower() && num <= theents.Upper()) { return theents(num); } else { static Handle(Standard_Transient) dummy; return dummy; } } /* //static Handle(Standard_Transient) dummy; { //smh#10 Protection. If iges entity does not exist, return null pointer. try { OCC_CATCH_SIGNALS Handle(Standard_Transient) temp = theents.Value(num); } ////sln 21.01.2002 OCC133: Exception handling // catch (Standard_OutOfRange) { // std::cout<<" Catch of sln"<