1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 //====================================================================
15 //#10 smh 22.12.99 Protection (case of unexisting directory entry in file)
16 //sln 21.01.2002 OCC133: Exception handling was added in method Interface_FileReaderData::BoundEntity
17 //====================================================================
19 #include <Interface_FileParameter.hxx>
20 #include <Interface_FileReaderData.hxx>
21 #include <Interface_ParamList.hxx>
22 #include <Interface_ParamSet.hxx>
23 #include <Standard_ErrorHandler.hxx>
24 #include <Standard_Transient.hxx>
25 #include <Standard_Type.hxx>
26 #include <TCollection_AsciiString.hxx>
28 IMPLEMENT_STANDARD_RTTIEXT(Interface_FileReaderData,Standard_Transient)
30 // Stoque les Donnees issues d un Fichier (Conservees sous forme Litterale)
31 // Chaque norme peut s en servir comme base (listes de parametres litteraux,
32 // entites associees) et y ajoute ses donnees propres.
33 // Travaille sous le controle de FileReaderTool
34 // Optimisation : Champs pas possibles, car Param est const. Dommage
35 // Donc, on suppose qu on lit un fichier a la fois (hypothese raisonnable)
36 // On note en champ un numero de fichier, par rapport auquel on optimise
37 static Standard_Integer thefic = 0;
38 static Standard_Integer thenm0 = -1;
39 static Standard_Integer thenp0 = -1;
42 Interface_FileReaderData::Interface_FileReaderData (const Standard_Integer nbr,
43 const Standard_Integer npar)
44 : therrload (0), thenumpar (0,nbr), theents (0,nbr)
46 theparams = new Interface_ParamSet (npar);
52 Standard_Integer Interface_FileReaderData::NbRecords () const
53 { return thenumpar.Upper(); }
55 Standard_Integer Interface_FileReaderData::NbEntities () const
57 Standard_Integer nb = 0; Standard_Integer num = 0;
58 while ( (num = FindNextRecord(num)) > 0) nb ++;
63 // .... Gestion des Parametres attaches aux Records ....
65 void Interface_FileReaderData::InitParams (const Standard_Integer num)
67 thenumpar.SetValue (num,theparams->NbParams());
70 void Interface_FileReaderData::AddParam
71 (const Standard_Integer /*num*/,
72 const Standard_CString aval, const Interface_ParamType atype,
73 const Standard_Integer nument)
75 theparams->Append(aval,-1,atype,nument);
78 void Interface_FileReaderData::AddParam
79 (const Standard_Integer /*num*/,
80 const TCollection_AsciiString& aval, const Interface_ParamType atype,
81 const Standard_Integer nument)
83 theparams->Append(aval.ToCString(),aval.Length(),atype,nument);
86 void Interface_FileReaderData::AddParam
87 (const Standard_Integer /*num*/,
88 const Interface_FileParameter& FP)
90 theparams->Append(FP);
94 void Interface_FileReaderData::SetParam
95 (const Standard_Integer num, const Standard_Integer nump,
96 const Interface_FileParameter& FP)
98 theparams->SetParam(thenumpar(num-1)+nump,FP);
101 Standard_Integer Interface_FileReaderData::NbParams
102 (const Standard_Integer num) const
104 if (num > 1) return (thenumpar(num) - thenumpar(num-1));
105 else if(num ==1) return thenumpar(num);
106 else return theparams->NbParams();
109 Handle(Interface_ParamList) Interface_FileReaderData::Params
110 (const Standard_Integer num) const
112 if (num == 0) return theparams->Params(0,0); // complet
113 else if(num ==1) return theparams->Params(0,thenumpar(1));
114 else return theparams->Params ( thenumpar(num-1)+1, (thenumpar(num) - thenumpar(num-1)) );
117 const Interface_FileParameter& Interface_FileReaderData::Param
118 (const Standard_Integer num, const Standard_Integer nump) const
120 if (thefic != thenum0) return theparams->Param(thenumpar(num-1)+nump);
121 if (thenm0 != num) { thenp0 = thenumpar(num-1); thenm0 = num; }
122 return theparams->Param (thenp0+nump);
125 Interface_FileParameter& Interface_FileReaderData::ChangeParam
126 (const Standard_Integer num, const Standard_Integer nump)
128 if (thefic != thenum0) return theparams->ChangeParam(thenumpar(num-1)+nump);
129 if (thenm0 != num) { thenp0 = thenumpar(num-1); thenm0 = num; }
130 return theparams->ChangeParam (thenp0+nump);
133 Interface_ParamType Interface_FileReaderData::ParamType
134 (const Standard_Integer num, const Standard_Integer nump) const
135 { return Param(num,nump).ParamType(); }
137 Standard_CString Interface_FileReaderData::ParamCValue
138 (const Standard_Integer num, const Standard_Integer nump) const
139 { return Param(num,nump).CValue(); }
142 Standard_Boolean Interface_FileReaderData::IsParamDefined
143 (const Standard_Integer num, const Standard_Integer nump) const
144 { return (Param(num,nump).ParamType() != Interface_ParamVoid); }
146 Standard_Integer Interface_FileReaderData::ParamNumber
147 (const Standard_Integer num, const Standard_Integer nump) const
148 { return Param(num,nump).EntityNumber(); }
150 const Handle(Standard_Transient)& Interface_FileReaderData::ParamEntity
151 (const Standard_Integer num, const Standard_Integer nump) const
152 { return BoundEntity (Param(num,nump).EntityNumber()); }
154 Interface_FileParameter& Interface_FileReaderData::ChangeParameter
155 (const Standard_Integer numpar)
156 { return theparams->ChangeParam (numpar); }
158 void Interface_FileReaderData::ParamPosition
159 (const Standard_Integer numpar,
160 Standard_Integer& num, Standard_Integer& nump) const
162 Standard_Integer nbe = thenumpar.Upper();
163 if (numpar <= 0) { num = nump = 0; return; }
164 for (Standard_Integer i = 1; i <= nbe; i ++) {
165 if (thenumpar(i) > numpar)
166 { num = i; nump = numpar - thenumpar(i) +1; return; }
168 num = nbe; nump = numpar - thenumpar(nbe) +1;
171 Standard_Integer Interface_FileReaderData::ParamFirstRank
172 (const Standard_Integer num) const
173 { return thenumpar(num); }
175 void Interface_FileReaderData::SetErrorLoad (const Standard_Boolean val)
176 { therrload = (val ? 1 : -1); }
178 Standard_Boolean Interface_FileReaderData::IsErrorLoad () const
179 { return (therrload != 0); }
181 Standard_Boolean Interface_FileReaderData::ResetErrorLoad ()
182 { Standard_Boolean res = (therrload > 0); therrload = 0; return res; }
184 // .... Gestion des Entites Associees aux Donnees du Fichier ....
187 const Handle(Standard_Transient)& Interface_FileReaderData::BoundEntity
188 (const Standard_Integer num) const
189 // { return theents(num); }
191 if (num >= theents.Lower() && num <= theents.Upper()) {
195 static Handle(Standard_Transient) dummy;
199 /* //static Handle(Standard_Transient) dummy;
201 //smh#10 Protection. If iges entity does not exist, return null pointer.
204 Handle(Standard_Transient) temp = theents.Value(num);
206 ////sln 21.01.2002 OCC133: Exception handling
207 // catch (Standard_OutOfRange) {
208 // std::cout<<" Catch of sln"<<std::endl;
212 catch (Standard_Failure) {
214 // some work-around, the best would be to modify CDL to
215 // return "Handle(Standard_Transient)" not "const Handle(Standard_Transient)&"
216 static Handle(Standard_Transient) dummy;
217 // std::cout<<" Catch of smh"<<std::endl;
221 //std::cout<<" Normal"<<std::endl;
222 if (theents.Value(num).IsImmutable()) std::cout << "IMMUTABLE:"<<num<<std::endl;
227 void Interface_FileReaderData::BindEntity
228 (const Standard_Integer num, const Handle(Standard_Transient)& ent)
229 // { theents.SetValue(num,ent); }
232 // if (ent.IsImmutable())
233 // std::cout << "Bind IMMUTABLE:"<<num<<std::endl;
235 theents.SetValue(num,ent);
238 void Interface_FileReaderData::Destroy ()
242 Standard_Real Interface_FileReaderData::Fastof (const Standard_CString ligne)
244 return Strtod (ligne, 0);