// File: Units_Measurement.cxx // Created: Wed Jun 24 12:38:53 1992 // Author: Gilles DEBARBOUILLE // #include #include #include #include #include #include #include //======================================================================= //function : Units_Measurement //purpose : //======================================================================= Units_Measurement::Units_Measurement() { themeasurement = 0.; myHasToken = Standard_False; } //======================================================================= //function : Units_Measurement //purpose : //======================================================================= Units_Measurement::Units_Measurement(const Standard_Real avalue, const Handle(Units_Token)& atoken) { themeasurement = avalue; thetoken = atoken; myHasToken = Standard_True; } //======================================================================= //function : Units_Measurement //purpose : //======================================================================= Units_Measurement::Units_Measurement(const Standard_Real avalue, const Standard_CString aunit) { themeasurement=avalue; Units_UnitSentence unit(aunit); if(!unit.IsDone()) { cout<<"can not create Units_Measurement - incorrect unit"<Word(aunit); thetoken->Mean("U"); myHasToken = Standard_True; } } //======================================================================= //function : Convert //purpose : //======================================================================= void Units_Measurement::Convert(const Standard_CString aunit) { Handle(Units_Token) oldtoken = thetoken; Units_UnitSentence newunit(aunit); if(!newunit.IsDone()) { cout<<"Units_Measurement: can not convert - incorrect unit => result is not correct"<Dimensions(); if(dimensions->IsEqual(Units::NullDimensions())) { thetoken=new Units_Token(aunit, "U"); thetoken->Value(((newunit.Sequence())->Value(1))->Value()); thetoken->Dimensions(((newunit.Sequence())->Value(1))->Dimensions()); themeasurement = oldtoken->Multiplied(themeasurement); themeasurement = newtoken->Divided(themeasurement); } else { cout<<" The units don't have the same physical dimensions"<Dimensions()->IsNotEqual((ameasurement.Token())->Dimensions())) return measurement; value = ameasurement.Token()->Multiplied(ameasurement.Measurement()); value = thetoken->Divided(value); value = themeasurement + value; Handle(Units_Token) token = thetoken->Creates(); return Units_Measurement(value,token); } //======================================================================= //function : Subtract //purpose : //======================================================================= Units_Measurement Units_Measurement::Subtract (const Units_Measurement& ameasurement) const { Standard_Real value; Units_Measurement measurement; if(thetoken->Dimensions()->IsNotEqual((ameasurement.Token())->Dimensions())) return measurement; value = ameasurement.Token()->Multiplied(ameasurement.Measurement()); value = thetoken->Divided(value); value = themeasurement - value; Handle(Units_Token) token = thetoken->Creates(); return Units_Measurement(value,token); } //======================================================================= //function : Multiply //purpose : //======================================================================= Units_Measurement Units_Measurement::Multiply (const Units_Measurement& ameasurement) const { Standard_Real value = themeasurement * ameasurement.Measurement(); Handle(Units_Token) token = thetoken * ameasurement.Token(); return Units_Measurement(value,token); } //======================================================================= //function : Multiply //purpose : //======================================================================= Units_Measurement Units_Measurement::Multiply (const Standard_Real avalue) const { Standard_Real value = themeasurement * avalue; Handle(Units_Token) token = thetoken->Creates(); return Units_Measurement(value,token); } //======================================================================= //function : Divide //purpose : //======================================================================= Units_Measurement Units_Measurement::Divide (const Units_Measurement& ameasurement) const { Standard_Real value = themeasurement / ameasurement.Measurement(); Handle(Units_Token) token = thetoken / ameasurement.Token(); return Units_Measurement(value,token); } //======================================================================= //function : Divide //purpose : //======================================================================= Units_Measurement Units_Measurement::Divide (const Standard_Real avalue) const { Standard_Real value = themeasurement / avalue; Handle(Units_Token) token = thetoken->Creates(); return Units_Measurement(value,token); } //======================================================================= //function : Power //purpose : //======================================================================= Units_Measurement Units_Measurement::Power (const Standard_Real anexponent) const { Standard_Real value = pow(themeasurement,anexponent); Handle(Units_Token) token = pow(thetoken,anexponent); return Units_Measurement(value,token); } //======================================================================= //function : HasToken //purpose : //======================================================================= Standard_Boolean Units_Measurement::HasToken() const { return myHasToken; } //======================================================================= //function : Dump //purpose : //======================================================================= void Units_Measurement::Dump() const { cout<<" Measurement : "<Dump(1,1); } #ifdef BUG //======================================================================= //function : operator* //purpose : //======================================================================= Units_Measurement operator*(const Standard_Real avalue, const Units_Measurement& ameasurement) { return ameasurement * avalue; } //======================================================================= //function : operator/ //purpose : //======================================================================= Units_Measurement operator/(const Standard_Real avalue,const Units_Measurement& ameasurement) { return ameasurement / avalue; } #endif