1 // Created on: 1993-10-22
2 // Created by: Gilles DEBARBOUILLE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // Convertir correctement les unites translatees
19 #include <Resource_Manager.hxx>
20 #include <Standard_Type.hxx>
21 #include <TCollection_AsciiString.hxx>
22 #include <TColStd_HSequenceOfHAsciiString.hxx>
24 #include <Units_Explorer.hxx>
25 #include <Units_NoSuchType.hxx>
26 #include <Units_NoSuchUnit.hxx>
27 #include <Units_Operators.hxx>
28 #include <Units_QuantitiesSequence.hxx>
29 #include <Units_Quantity.hxx>
30 #include <Units_ShiftedToken.hxx>
31 #include <Units_ShiftedUnit.hxx>
32 #include <Units_Token.hxx>
33 #include <Units_Unit.hxx>
34 #include <Units_UnitsDictionary.hxx>
35 #include <Units_UnitSentence.hxx>
36 #include <Units_UnitsSequence.hxx>
37 #include <Units_UnitsSystem.hxx>
39 IMPLEMENT_STANDARD_RTTIEXT(Units_UnitsSystem,Standard_Transient)
41 //=======================================================================
42 //function : Units_UnitsSystem
44 //=======================================================================
45 Units_UnitsSystem::Units_UnitsSystem()
47 thequantitiessequence = new Units_QuantitiesSequence();
48 theactiveunitssequence = new TColStd_HSequenceOfInteger;
52 //=======================================================================
53 //function : Units_UnitsSystem
55 //=======================================================================
57 Units_UnitsSystem::Units_UnitsSystem(const Standard_CString aName,
58 const Standard_Boolean Verbose)
60 Handle(Resource_Manager) themanager = new Resource_Manager(aName,Verbose);
62 thequantitiessequence = new Units_QuantitiesSequence();
63 theactiveunitssequence = new TColStd_HSequenceOfInteger;
67 //=======================================================================
68 //function : QuantitiesSequence
70 //=======================================================================
72 Handle(Units_QuantitiesSequence) Units_UnitsSystem::QuantitiesSequence() const
74 return thequantitiessequence;
78 //=======================================================================
79 //function : ActiveUnitsSequence
81 //=======================================================================
83 Handle(TColStd_HSequenceOfInteger) Units_UnitsSystem::ActiveUnitsSequence() const
85 return theactiveunitssequence;
89 //=======================================================================
92 //=======================================================================
94 void Units_UnitsSystem::Specify(const Standard_CString aquantity,const Standard_CString aunit)
96 Standard_Integer index;
97 Handle(Units_Unit) unit;
98 Handle(Units_UnitsSequence) unitssequence;
99 Handle(Units_Quantity) quantity;
100 Handle(Units_Quantity) thequantity;
101 Handle(Units_QuantitiesSequence) quantitiessequence;
102 TCollection_AsciiString quantityname;
104 Units_UnitSentence unitsentence(aunit);
105 if(!unitsentence.IsDone()) {
106 cout<<"Units_UnitsSystem::Specify : incorrect unit"<<endl;
109 Handle(Units_Token) token = unitsentence.Evaluate();
111 if( token->IsKind(STANDARD_TYPE(Units_ShiftedToken)) ) {
112 Handle(Units_ShiftedToken) stoken =
113 Handle(Units_ShiftedToken)::DownCast(token) ;
114 Handle(Units_ShiftedUnit) sunit;
115 unit = sunit = new Units_ShiftedUnit(aunit,aunit);
116 sunit->Value(stoken->Value());
117 sunit->Move(stoken->Move());
119 unit = new Units_Unit(aunit,aunit);
120 unit->Value(token->Value());
123 for(index=1;index<=thequantitiessequence->Length();index++) {
124 quantity = thequantitiessequence->Value(index);
125 if(quantity == aquantity) {
126 unit->Quantity(quantity);
127 quantity->Sequence()->Append(unit);
132 quantity = Units::Quantity(aquantity);
134 // Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
135 if( quantity.IsNull() ) {
136 cout<<"Warning: in Units_UnitsSystem : Units_NoSuchType '" << aquantity << "'" << endl;
140 unitssequence = new Units_UnitsSequence();
141 quantityname = quantity->Name();
142 thequantity = new Units_Quantity(quantityname.ToCString(),quantity->Dimensions(),unitssequence);
143 unit->Quantity(thequantity);
144 thequantitiessequence->Append(thequantity);
145 theactiveunitssequence->Append(0);
146 thequantity->Sequence()->Append(unit);
150 //=======================================================================
153 //=======================================================================
155 void Units_UnitsSystem::Remove(const Standard_CString aquantity,
156 const Standard_CString aunit)
158 Standard_Integer index1,index2;
159 Handle(Units_Unit) unit;
160 Handle(Units_UnitsSequence) unitssequence;
161 Handle(Units_Quantity) quantity;
163 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
165 quantity = thequantitiessequence->Value(index1);
166 if(quantity == aquantity) {
168 unitssequence = quantity->Sequence();
169 for(index2=1;index2<=unitssequence->Length();index2++) {
171 unit = unitssequence->Value(index2);
173 unitssequence->Remove(index2);
175 if(unitssequence->Length() == 0) {
176 thequantitiessequence->Remove(index1);
177 theactiveunitssequence->Remove(index1);
180 if(theactiveunitssequence->Value(index1) == index2)
181 theactiveunitssequence->SetValue(index1,0);
182 else if(theactiveunitssequence->Value(index1) > index2)
183 theactiveunitssequence->SetValue(index1,theactiveunitssequence->Value(index1)-1);
189 throw Units_NoSuchUnit(aunit);
194 throw Units_NoSuchType(aquantity);
198 //=======================================================================
199 //function : Activate
201 //=======================================================================
203 void Units_UnitsSystem::Activate(const Standard_CString aquantity,
204 const Standard_CString aunit)
206 Standard_Integer index1,index2;
207 Handle(Units_Unit) unit;
208 Handle(Units_UnitsSequence) unitssequence;
209 Handle(Units_Quantity) quantity;
211 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
212 quantity = thequantitiessequence->Value(index1);
213 if(quantity == aquantity) {
214 unitssequence = quantity->Sequence();
215 for(index2=1;index2<=thequantitiessequence->Length();index2++) {
216 unit = unitssequence->Value(index2);
218 theactiveunitssequence->SetValue(index1,index2);
222 throw Units_NoSuchUnit(aunit);
226 throw Units_NoSuchType(aquantity);
230 //=======================================================================
231 //function : Activates
233 //=======================================================================
235 void Units_UnitsSystem::Activates()
237 Standard_Integer index;
238 Handle(Units_UnitsSequence) unitssequence;
239 Handle(Units_Quantity) quantity;
241 for(index=1;index<=thequantitiessequence->Length();index++) {
242 quantity = thequantitiessequence->Value(index);
243 unitssequence = quantity->Sequence();
244 if( unitssequence->Length() > 0 ) {
245 theactiveunitssequence->SetValue(index,1);
251 //=======================================================================
252 //function : ActiveUnit
254 //=======================================================================
256 TCollection_AsciiString Units_UnitsSystem::ActiveUnit(const Standard_CString aquantity) const
258 Standard_Integer index1,index2;
259 Handle(Units_Unit) unit;
260 Handle(Units_UnitsSequence) unitssequence;
261 Handle(Units_Quantity) quantity;
263 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
264 quantity = thequantitiessequence->Value(index1);
265 if(quantity == aquantity) {
266 unitssequence = quantity->Sequence();
267 index2 = theactiveunitssequence->Value(index1);
269 return unitssequence->Value(index2)->SymbolsSequence()->Value(1)->String();
272 cout<<" Pas d'unite active pour "<<aquantity<<endl;
274 return TCollection_AsciiString() ;
279 throw Units_NoSuchType(aquantity);
283 //=======================================================================
284 //function : ConvertValueToUserSystem
286 //=======================================================================
288 Standard_Real Units_UnitsSystem::ConvertValueToUserSystem
289 (const Standard_CString aquantity,
290 const Standard_Real avalue,
291 const Standard_CString aunit) const
293 Units_UnitSentence unitsentence(aunit);
294 if(!unitsentence.IsDone()) {
295 cout<<"Units_UnitsSystem::ConvertValueToUserSystem : incorrect unit => return 0"<<endl;
298 return ConvertSIValueToUserSystem(aquantity,avalue*(unitsentence.Evaluate())->Value());
302 //=======================================================================
303 //function : ConvertSIValueToUserSystem
305 //=======================================================================
307 Standard_Real Units_UnitsSystem::ConvertSIValueToUserSystem
308 (const Standard_CString aquantity,const Standard_Real avalue) const
310 Standard_Integer index,activeunit;
311 Handle(Units_UnitsSequence) unitssequence;
312 Handle(Units_Quantity) quantity;
313 Handle(Units_QuantitiesSequence) quantitiessequence;
314 Handle(Units_Unit) unit;
315 Handle(Units_ShiftedUnit) sunit;
316 Standard_Real uvalue,umove;
318 for(index=1;index<=thequantitiessequence->Length();index++) {
319 quantity = thequantitiessequence->Value(index);
320 if(quantity == aquantity) {
321 activeunit = theactiveunitssequence->Value(index);
323 unitssequence = quantity->Sequence();
324 unit = unitssequence->Value(activeunit);
325 if( unit->IsKind(STANDARD_TYPE(Units_ShiftedUnit)) ) {
326 sunit = Handle(Units_ShiftedUnit)::DownCast(unit) ;
327 uvalue = sunit->Value();
328 umove = sunit->Move();
329 return avalue/uvalue - umove;
333 uvalue = unit->Value();
334 return avalue/uvalue;
343 quantity = Units::Quantity(aquantity);
345 Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
351 //=======================================================================
352 //function : ConvertUserSystemValueToSI
354 //=======================================================================
356 Standard_Real Units_UnitsSystem::ConvertUserSystemValueToSI
357 (const Standard_CString aquantity,const Standard_Real avalue) const
359 Standard_Integer index,activeunit;
360 Handle(Units_UnitsSequence) unitssequence;
361 Handle(Units_Quantity) quantity;
362 Handle(Units_QuantitiesSequence) quantitiessequence;
363 Handle(Units_Unit) unit;
364 Handle(Units_ShiftedUnit) sunit;
365 Standard_Real uvalue,umove;
367 for(index=1;index<=thequantitiessequence->Length();index++) {
368 quantity = thequantitiessequence->Value(index);
369 if(quantity == aquantity) {
370 activeunit = theactiveunitssequence->Value(index);
372 unitssequence = quantity->Sequence();
373 unit = unitssequence->Value(activeunit);
374 if( unit->IsKind(STANDARD_TYPE(Units_ShiftedUnit)) ) {
375 sunit = Handle(Units_ShiftedUnit)::DownCast(unit) ;
376 uvalue = sunit->Value();
377 umove = sunit->Move();
378 return avalue*(uvalue + umove);
381 uvalue = unit->Value();
382 return avalue*uvalue;
391 quantity = Units::Quantity(aquantity);
393 Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
399 //=======================================================================
402 //=======================================================================
404 void Units_UnitsSystem::Dump() const
406 Handle(Standard_Transient) transient = This();
407 Handle(Units_UnitsSystem) unitssystem = Handle(Units_UnitsSystem)::DownCast (transient);
408 Units_Explorer explorer(unitssystem);
409 cout<<" UNITSSYSTEM : "<<endl;
410 for(; explorer.MoreQuantity(); explorer.NextQuantity()) {
411 cout<<explorer.Quantity()<<endl;
412 for(; explorer.MoreUnit(); explorer.NextUnit())
413 cout<<" "<<explorer.Unit()<<endl;
418 //=======================================================================
421 //=======================================================================
423 Standard_Boolean Units_UnitsSystem::IsEmpty() const
425 return (thequantitiessequence->Length() > 0) ? Standard_False : Standard_True;