o a&/@sxdZddlmZddlmZgdZeeefZdZ ddZ eGdd d Z Gd d d e Z Gd d d e Z e Ze ZdS)a Distance and Area objects to allow for sensible and convenient calculation and conversions. Authors: Robert Coup, Justin Bronn, Riccardo Di Virgilio Inspired by GeoPy (https://github.com/geopy/geopy) and Geoff Biggs' PhD work on dimensioned units for robotics. )Decimal)total_ordering)AAreaDDistancesq_cCs|jtkr|jS|jjSN) __class__type__name__)objr||\}|_t||j||rt|tr||_dSdSdSr ) default_units _default_unitsetattr STANDARD_UNIT isinstancestr)self default_unitkwargsvaluerrr__init__:s  zMeasureBase.__init__cCs t||jSr )getattrrrrrr _get_standard@s zMeasureBase._get_standardcCst||j|dSr )rr)rrrrr _set_standardCszMeasureBase._set_standardcCs&||jvr |j|j|Std|)NUnknown unit type: %s)UNITSstandardAttributeError)rnamerrr __getattr__Hs  zMeasureBase.__getattr__cCsdt||jt||jfS)Nz %s(%s=%s))rrrrrrr__repr__NszMeasureBase.__repr__cCsdt||j|jfS)Nz%s %s)rrrrrr__str__QszMeasureBase.__str__cCst||jr |j|jkStSr rr r#NotImplementedrotherrrr__eq__V  zMeasureBase.__eq__cC t|jSr )hashr#rrrr__hash__\ zMeasureBase.__hash__cCst||jr |j|jkStSr r)r+rrr__lt___r.zMeasureBase.__lt__cCsDt||jr|jdd|ji|j|j|jiStddt|i)Nr&%(class)s must be added with %(class)sclassrrr rrr# TypeErrorrr+rrr__add__g zMeasureBase.__add__cCs4t||jr|j|j7_|Stddt|i)Nr4r5rr r#r7rr+rrr__iadd__p zMeasureBase.__iadd__cCsDt||jr|jdd|ji|j|j|jiStddt|i)Nr+%(class)s must be subtracted from %(class)sr5rr6r+rrr__sub__wr9zMeasureBase.__sub__cCs4t||jr|j|j8_|Stddt|i)Nr=r5r:r+rrr__isub__r<zMeasureBase.__isub__cCs@t|tr|jdd|ji|j|j|iStddt|i)Nr(%(class)s must be multiplied with numberr5rr NUMERIC_TYPESr rrr#r7rr+rrr__mul__ zMeasureBase.__mul__cCs4t|tr|jt|9_|Stddt|i)Nr@r5rrBr#floatr7rr+rrr__imul__ zMeasureBase.__imul__cCs||Sr rr+rrr__rmul__szMeasureBase.__rmul__cCsXt||jr |j|jSt|tr"|jdd|ji|j|j|iStddt|i)Nrz2%(class)s must be divided with number or %(class)sr5r)rr r#rBrrr7rr+rrr __truediv__s   zMeasureBase.__truediv__cCs4t|tr|jt|_|Stddt|i)Nz%%(class)s must be divided with numberr5rEr+rrr __itruediv__rHzMeasureBase.__itruediv__cCr/r )boolr#rrrr__bool__r2zMeasureBase.__bool__cCsd}|j}|D]d\}}t|tst|}||jvr'||j||7}|}q ||jvr=|j|}||j||7}|}q |}||jvrR||j||7}|}q ||jvrh|j|}||j||7}|}q td|||fS)z| Return the unit value and the default units specified from the given keyword arguments dictionary. gr!) ritemsrrFr"ALIASlowerLALIASr$)rrvalrunitrurPrrrrs,        zMeasureBase.default_unitscCsD|}||jvr |S||jvr|S||jvr|j|Std|)z Retrieve the unit attribute name for the given unit string. For example, if the given unit string is 'metre', return 'm'. Raise an exception if an attribute cannot be found. z2Could not find a unit keyword associated with "%s")rPr"rQ Exception)clsunit_strrPrrr unit_attnames     zMeasureBase.unit_attnamer )r __module__ __qualname__rrOr"rQrrr propertyr#r&r'r(r-r1r3r8r;r>r?rCrGrIrJrKrMr classmethodrXrrrrr3s8      rc@seZdZdZidddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3Zid4dd5dd6d7d8d9d:d9d;ddd?d>d@dAdBdAdCdDdEdFdGddHd dId dJdidKddLddMddNddOddPddQddRddSddTddUd dVd"dWdXdYdZd[d\d]d^d_d`d`d"dadbZdcddeDZdedfZdgS)hrmchaing=,Ԛ4@ chain_benoitgl4@ chain_searsgsgB?)inchkmlink link_benoit link_searsr]mimmnmnm_ukrodsears_yd survey_ftumyd centimeterfootinchesro kilometerrp kilometremetermetre micrometerr{ micrometre millimeterru millimetremilertyardr|zBritish chain (Benoit 1895 B)zBritish chain (Sears 1922)z$British chain (Sears 1922 truncated)zBritish foot (Sears 1922)z British footzBritish yard (Sears 1922)z British yardz Clarke's Footz Clarke's linkzChain (Benoit)z Chain (Sears)zFoot (International)z Furrow LongzGerman legal metrezGold Coast footz Indian yardz Link (Benoit)rrz Link (Sears)rsz Nautical MilervzNautical Mile (UK)rwzUS survey footrzry)z U.S. Footz Yard (Indian)z Yard (Sears)cCi|] \}}||qSrrP.0kvrrr ,zDistance.cCsxt||jrtddt|jit|j|j|jiSt|tr1|jdd|ji|j|j|iStddt |ji)Nrz;%(distance)s must be multiplied with number or %(distance)sdistancer) rr r AREA_PREFIXrrr#rBr7rr+rrrrC.s   zDistance.__mul__N) r rYrZrr"rOrNrQrCrrrrrs     $      !"#' rc@sXeZdZeejZddejDZddejDZddeDZ ddZ dS)rcCs"i|] \}}dt|f|dqS)%s%srrrrrrBs"zArea.cCsi|] \}}|dt|fqS)rrrrrrrCscCrrrrrrrrDrcCs@t|tr|jdd|ji|j|j|iStddt|i)Nrz%%(class)s must be divided by a numberr5rrAr+rrrrJFrDzArea.__truediv__N) r rYrZrrrr"rNrOrQrJrrrrr?s   rN)__doc__decimalr functoolsr__all__intrFrBrrrrrrrrrrrs  ,`