2 # -*- coding: ISO-8859-1 -*-
5 # Copyright (C) 2002-2004 Jörg Lehmann <joergl@users.sourceforge.net>
6 # Copyright (C) 2002-2004 André Wobst <wobsta@users.sourceforge.net>
8 # This file is part of PyX (http://pyx.sourceforge.net/).
10 # PyX is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
15 # PyX is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with PyX; if not, write to the Free Software
22 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 scale
= { 't':1, 'u':1, 'v':1, 'w':1, 'x':1 }
40 def set(uscale
=None, vscale
=None, wscale
=None, xscale
=None, defaultunit
=None):
41 if uscale
is not None:
43 if vscale
is not None:
45 if wscale
is not None:
47 if xscale
is not None:
49 if defaultunit
is not None:
51 _default_unit
= defaultunit
54 def _convert_to(l
, dest_unit
="m"):
55 if type(l
) in (types
.IntType
, types
.LongType
, types
.FloatType
):
56 return l
* _m
[_default_unit
] * scale
['u'] / _m
[dest_unit
]
57 elif not isinstance(l
, length
):
58 l
= length(l
) # convert to length instance if necessary
60 return (l
.t
+ l
.u
*scale
['u'] + l
.v
*scale
['v'] + l
.w
*scale
['w'] + l
.x
*scale
['x']) / _m
[dest_unit
]
63 return _convert_to(l
, "m")
66 return _convert_to(l
, "cm")
69 return _convert_to(l
, "mm")
72 return _convert_to(l
, "inch")
75 return _convert_to(l
, "pt")
77 ################################################################################
78 # class for generic length
79 ################################################################################
84 PyX lengths are composed of five components (t=true, u=user, v=visual,
85 w=width, and x=TeX) which can be scaled separately (except for the true
86 component, which is always unscaled). Lengths can be constructed in units
87 of "pt", "mm", "cm", "m" and "inch". When no unit is given, a module
88 default is used, which can be changed with the help of the set method of
92 def __init__(self
, f
, type="u", unit
=None):
93 """ create a length instance of the given type with a length f
94 in the given unit. If unit is not set, the currently set default unit is used.
96 self
.t
= self
.u
= self
.v
= self
.w
= self
.x
= 0
97 l
= f
* _m
[unit
or _default_unit
]
109 def __cmp__(self
, other
):
110 return cmp(tom(self
), tom(other
))
112 def __mul__(self
, factor
):
113 result
= copy
.copy(self
)
123 def __div__(self
, factor
):
124 result
= copy
.copy(self
)
132 def __add__(self
, other
):
133 # convert to length if necessary
134 if not isinstance(other
, length
):
135 other
= length(other
)
136 result
= copy
.copy(self
)
146 def __sub__(self
, other
):
147 # convert to length if necessary
148 if not isinstance(other
, length
):
149 other
= length(other
)
150 result
= copy
.copy(self
)
158 def __rsub__(self
, other
):
159 # convert to length if necessary
160 if not isinstance(other
, length
):
161 other
= length(other
)
162 result
= copy
.copy(self
)
163 result
.t
= other
.t
- self
.t
164 result
.u
= other
.u
- self
.u
165 result
.v
= other
.v
- self
.v
166 result
.w
= other
.w
- self
.w
167 result
.x
= other
.x
- self
.x
171 result
= copy
.copy(self
)
180 return "(%(t)f t + %(u)f u + %(v)f v + %(w)f w + %(x)f x) m" % self
.__dict
__
183 ################################################################################
184 # predefined instances which can be used as length units
185 ################################################################################
187 # user lengths and unqualified length which are also user length
188 u_pt
= pt
= length(1, type="u", unit
="pt")
189 u_m
= m
= length(1, type="u", unit
="m")
190 u_mm
= mm
= length(1, type="u", unit
="mm")
191 u_cm
= cm
= length(1, type="u", unit
="cm")
192 u_inch
= inch
= length(1, type="u", unit
="inch")
195 t_pt
= length(1, type="t", unit
="pt")
196 t_m
= length(1, type="t", unit
="m")
197 t_mm
= length(1, type="t", unit
="mm")
198 t_cm
= length(1, type="t", unit
="cm")
199 t_inch
= length(1, type="t", unit
="inch")
202 v_pt
= length(1, type="v", unit
="pt")
203 v_m
= length(1, type="v", unit
="m")
204 v_mm
= length(1, type="v", unit
="mm")
205 v_cm
= length(1, type="v", unit
="cm")
206 v_inch
= length(1, type="v", unit
="inch")
209 w_pt
= length(1, type="w", unit
="pt")
210 w_m
= length(1, type="w", unit
="m")
211 w_mm
= length(1, type="w", unit
="mm")
212 w_cm
= length(1, type="w", unit
="cm")
213 w_inch
= length(1, type="w", unit
="inch")
216 x_pt
= length(1, type="x", unit
="pt")
217 x_m
= length(1, type="x", unit
="m")
218 x_mm
= length(1, type="x", unit
="mm")
219 x_cm
= length(1, type="x", unit
="cm")
220 x_inch
= length(1, type="x", unit
="inch")