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 #define PRO8619 //GG_160697
18 // Convertir correctement les unites translatees
20 #include <Units_UnitsSystem.ixx>
22 #include <Units_UnitsDictionary.hxx>
23 #include <Units_QuantitiesSequence.hxx>
24 #include <Units_Explorer.hxx>
25 #include <Units_Quantity.hxx>
26 #include <Units_UnitsSequence.hxx>
27 #include <Units_UnitSentence.hxx>
28 #include <Units_Unit.hxx>
29 #include <Units_ShiftedUnit.hxx>
30 #include <Units_Token.hxx>
31 #include <Units_ShiftedToken.hxx>
32 #include <Resource_Manager.hxx>
33 #include <TCollection_AsciiString.hxx>
34 #include <TColStd_HSequenceOfHAsciiString.hxx>
35 #include <Units_Operators.hxx>
38 //=======================================================================
39 //function : Units_UnitsSystem
41 //=======================================================================
43 Units_UnitsSystem::Units_UnitsSystem()
45 thequantitiessequence = new Units_QuantitiesSequence();
46 theactiveunitssequence = new TColStd_HSequenceOfInteger;
50 //=======================================================================
51 //function : Units_UnitsSystem
53 //=======================================================================
55 Units_UnitsSystem::Units_UnitsSystem(const Standard_CString aName,
56 const Standard_Boolean Verbose)
58 Handle(Resource_Manager) themanager = new Resource_Manager(aName,Verbose);
60 thequantitiessequence = new Units_QuantitiesSequence();
61 theactiveunitssequence = new TColStd_HSequenceOfInteger;
65 //=======================================================================
66 //function : QuantitiesSequence
68 //=======================================================================
70 Handle(Units_QuantitiesSequence) Units_UnitsSystem::QuantitiesSequence() const
72 return thequantitiessequence;
76 //=======================================================================
77 //function : ActiveUnitsSequence
79 //=======================================================================
81 Handle(TColStd_HSequenceOfInteger) Units_UnitsSystem::ActiveUnitsSequence() const
83 return theactiveunitssequence;
87 //=======================================================================
90 //=======================================================================
92 void Units_UnitsSystem::Specify(const Standard_CString aquantity,const Standard_CString aunit)
94 Standard_Integer index;
95 Handle(Units_Unit) unit;
96 Handle(Units_UnitsSequence) unitssequence;
97 Handle(Units_Quantity) quantity;
98 Handle(Units_Quantity) thequantity;
99 Handle(Units_QuantitiesSequence) quantitiessequence;
100 TCollection_AsciiString quantityname;
102 Units_UnitSentence unitsentence(aunit);
103 if(!unitsentence.IsDone()) {
104 cout<<"Units_UnitsSystem::Specify : incorrect unit"<<endl;
107 Handle(Units_Token) token = unitsentence.Evaluate();
110 if( token->IsKind(STANDARD_TYPE(Units_ShiftedToken)) ) {
111 Handle(Units_ShiftedToken) stoken =
112 Handle(Units_ShiftedToken)::DownCast(token) ;
113 Handle(Units_ShiftedUnit) sunit;
114 unit = sunit = new Units_ShiftedUnit(aunit,aunit);
115 sunit->Value(stoken->Value());
116 sunit->Move(stoken->Move());
120 unit = new Units_Unit(aunit,aunit);
121 unit->Value(token->Value());
124 for(index=1;index<=thequantitiessequence->Length();index++) {
125 quantity = thequantitiessequence->Value(index);
126 if(quantity == aquantity) {
127 unit->Quantity(quantity);
128 quantity->Sequence()->Append(unit);
133 quantity = Units::Quantity(aquantity);
135 // Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
136 if( quantity.IsNull() ) {
137 cout<<"Warning: in Units_UnitsSystem : Units_NoSuchType '" << aquantity << "'" << endl;
141 unitssequence = new Units_UnitsSequence();
142 quantityname = quantity->Name();
143 thequantity = new Units_Quantity(quantityname.ToCString(),quantity->Dimensions(),unitssequence);
144 unit->Quantity(thequantity);
145 thequantitiessequence->Append(thequantity);
146 theactiveunitssequence->Append(0);
147 thequantity->Sequence()->Append(unit);
151 //=======================================================================
154 //=======================================================================
156 void Units_UnitsSystem::Remove(const Standard_CString aquantity,
157 const Standard_CString aunit)
159 Standard_Integer index1,index2;
160 Handle(Units_Unit) unit;
161 Handle(Units_UnitsSequence) unitssequence;
162 Handle(Units_Quantity) quantity;
164 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
166 quantity = thequantitiessequence->Value(index1);
167 if(quantity == aquantity) {
169 unitssequence = quantity->Sequence();
170 for(index2=1;index2<=unitssequence->Length();index2++) {
172 unit = unitssequence->Value(index2);
174 unitssequence->Remove(index2);
176 if(unitssequence->Length() == 0) {
177 thequantitiessequence->Remove(index1);
178 theactiveunitssequence->Remove(index1);
181 if(theactiveunitssequence->Value(index1) == index2)
182 theactiveunitssequence->SetValue(index1,0);
183 else if(theactiveunitssequence->Value(index1) > index2)
184 theactiveunitssequence->SetValue(index1,theactiveunitssequence->Value(index1)-1);
190 Units_NoSuchUnit::Raise(aunit);
195 Units_NoSuchType::Raise(aquantity);
199 //=======================================================================
200 //function : Activate
202 //=======================================================================
204 void Units_UnitsSystem::Activate(const Standard_CString aquantity,
205 const Standard_CString aunit)
207 Standard_Integer index1,index2;
208 Handle(Units_Unit) unit;
209 Handle(Units_UnitsSequence) unitssequence;
210 Handle(Units_Quantity) quantity;
212 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
213 quantity = thequantitiessequence->Value(index1);
214 if(quantity == aquantity) {
215 unitssequence = quantity->Sequence();
216 for(index2=1;index2<=thequantitiessequence->Length();index2++) {
217 unit = unitssequence->Value(index2);
219 theactiveunitssequence->SetValue(index1,index2);
223 Units_NoSuchUnit::Raise(aunit);
227 Units_NoSuchType::Raise(aquantity);
231 //=======================================================================
232 //function : Activates
234 //=======================================================================
236 void Units_UnitsSystem::Activates()
238 Standard_Integer index;
239 Handle(Units_UnitsSequence) unitssequence;
240 Handle(Units_Quantity) quantity;
242 for(index=1;index<=thequantitiessequence->Length();index++) {
243 quantity = thequantitiessequence->Value(index);
244 unitssequence = quantity->Sequence();
245 if( unitssequence->Length() > 0 ) {
246 theactiveunitssequence->SetValue(index,1);
252 //=======================================================================
253 //function : ActiveUnit
255 //=======================================================================
257 TCollection_AsciiString Units_UnitsSystem::ActiveUnit(const Standard_CString aquantity) const
259 Standard_Integer index1,index2;
260 Handle(Units_Unit) unit;
261 Handle(Units_UnitsSequence) unitssequence;
262 Handle(Units_Quantity) quantity;
264 for(index1=1;index1<=thequantitiessequence->Length();index1++) {
265 quantity = thequantitiessequence->Value(index1);
266 if(quantity == aquantity) {
267 unitssequence = quantity->Sequence();
268 index2 = theactiveunitssequence->Value(index1);
270 return unitssequence->Value(index2)->SymbolsSequence()->Value(1)->String();
272 cout<<" Pas d'unite active pour "<<aquantity<<endl;
273 return TCollection_AsciiString() ;
278 Units_NoSuchType::Raise(aquantity);
279 return TCollection_AsciiString() ;
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);
326 if( unit->IsKind(STANDARD_TYPE(Units_ShiftedUnit)) ) {
327 sunit = Handle(Units_ShiftedUnit)::DownCast(unit) ;
328 uvalue = sunit->Value();
329 umove = sunit->Move();
330 return avalue/uvalue - umove;
335 uvalue = unit->Value();
336 return avalue/uvalue;
345 quantity = Units::Quantity(aquantity);
347 Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
353 //=======================================================================
354 //function : ConvertUserSystemValueToSI
356 //=======================================================================
358 Standard_Real Units_UnitsSystem::ConvertUserSystemValueToSI
359 (const Standard_CString aquantity,const Standard_Real avalue) const
361 Standard_Integer index,activeunit;
362 Handle(Units_UnitsSequence) unitssequence;
363 Handle(Units_Quantity) quantity;
364 Handle(Units_QuantitiesSequence) quantitiessequence;
365 Handle(Units_Unit) unit;
366 Handle(Units_ShiftedUnit) sunit;
367 Standard_Real uvalue,umove;
369 for(index=1;index<=thequantitiessequence->Length();index++) {
370 quantity = thequantitiessequence->Value(index);
371 if(quantity == aquantity) {
372 activeunit = theactiveunitssequence->Value(index);
374 unitssequence = quantity->Sequence();
375 unit = unitssequence->Value(activeunit);
377 if( unit->IsKind(STANDARD_TYPE(Units_ShiftedUnit)) ) {
378 sunit = Handle(Units_ShiftedUnit)::DownCast(unit) ;
379 uvalue = sunit->Value();
380 umove = sunit->Move();
381 return avalue*(uvalue + umove);
385 uvalue = unit->Value();
386 return avalue*uvalue;
395 quantity = Units::Quantity(aquantity);
397 Units_NoSuchType_Raise_if(quantity.IsNull(),aquantity);
403 //=======================================================================
406 //=======================================================================
408 void Units_UnitsSystem::Dump() const
410 Handle(Standard_Transient) transient = This();
411 Handle(Units_UnitsSystem) unitssystem = *(Handle(Units_UnitsSystem)*)&transient;
412 Units_Explorer explorer(unitssystem);
413 cout<<" UNITSSYSTEM : "<<endl;
414 for(; explorer.MoreQuantity(); explorer.NextQuantity()) {
415 cout<<explorer.Quantity()<<endl;
416 for(; explorer.MoreUnit(); explorer.NextUnit())
417 cout<<" "<<explorer.Unit()<<endl;
422 //=======================================================================
425 //=======================================================================
427 Standard_Boolean Units_UnitsSystem::IsEmpty() const
429 return (thequantitiessequence->Length() > 0) ? Standard_False : Standard_True;