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
27 scale
= { 't':1, 'u':1, 'v':1, 'w':1, 'x':1 }
39 def set(uscale
=None, vscale
=None, wscale
=None, xscale
=None, defaultunit
=None):
40 if uscale
is not None:
42 if vscale
is not None:
44 if wscale
is not None:
46 if xscale
is not None:
48 if defaultunit
is not None:
50 _default_unit
= defaultunit
53 def _convert_to(l
, dest_unit
="m"):
54 if type(l
) in (types
.IntType
, types
.LongType
, types
.FloatType
):
55 return l
* _m
[_default_unit
] * scale
['u'] / _m
[dest_unit
]
56 elif not isinstance(l
, length
):
57 l
= length(l
) # convert to length instance if necessary
59 return (l
.t
+ l
.u
*scale
['u'] + l
.v
*scale
['v'] + l
.w
*scale
['w'] + l
.x
*scale
['x']) / _m
[dest_unit
]
62 return _convert_to(l
, "m")
65 return _convert_to(l
, "cm")
68 return _convert_to(l
, "mm")
71 return _convert_to(l
, "inch")
74 return _convert_to(l
, "pt")
76 ################################################################################
77 # class for generic length
78 ################################################################################
83 PyX lengths are composed of five components (t=true, u=user, v=visual,
84 w=width, and x=TeX) which can be scaled separately (except for the true
85 component, which is always unscaled). Lengths can be constructed in units
86 of "pt", "mm", "cm", "m" and "inch". When no unit is given, a module
87 default is used, which can be changed with the help of the set method of
91 def __init__(self
, f
=0, type="u", unit
=None):
92 """ create a length instance of the given type with a length f
93 in the given unit. If unit is not set, the currently set default unit is used.
95 self
.t
= self
.u
= self
.v
= self
.w
= self
.x
= 0
96 l
= f
* _m
[unit
or _default_unit
]
108 def __cmp__(self
, other
):
109 return cmp(tom(self
), tom(other
))
111 def __mul__(self
, factor
):
113 result
.t
= factor
* self
.t
114 result
.u
= factor
* self
.u
115 result
.v
= factor
* self
.v
116 result
.w
= factor
* self
.w
117 result
.x
= factor
* self
.x
122 def __div__(self
, factor
):
123 if isinstance(factor
, length
):
124 return tom(self
) / tom(factor
)
126 result
.t
= self
.t
/ factor
127 result
.u
= self
.u
/ factor
128 result
.v
= self
.v
/ factor
129 result
.w
= self
.w
/ factor
130 result
.x
= self
.x
/ factor
133 def __add__(self
, other
):
134 # convert to length if necessary
135 if not isinstance(other
, length
):
136 other
= length(other
)
138 result
.t
= self
.t
+ other
.t
139 result
.u
= self
.u
+ other
.u
140 result
.v
= self
.v
+ other
.v
141 result
.w
= self
.w
+ other
.w
142 result
.x
= self
.x
+ other
.x
147 def __sub__(self
, other
):
148 # convert to length if necessary
149 if not isinstance(other
, length
):
150 other
= length(other
)
152 result
.t
= self
.t
- other
.t
153 result
.u
= self
.u
- other
.u
154 result
.v
= self
.v
- other
.v
155 result
.w
= self
.w
- other
.w
156 result
.x
= self
.x
- other
.x
159 def __rsub__(self
, other
):
160 # convert to length if necessary
161 if not isinstance(other
, length
):
162 other
= length(other
)
164 result
.t
= other
.t
- self
.t
165 result
.u
= other
.u
- self
.u
166 result
.v
= other
.v
- self
.v
167 result
.w
= other
.w
- self
.w
168 result
.x
= other
.x
- self
.x
181 return "(%(t)f t + %(u)f u + %(v)f v + %(w)f w + %(x)f x) m" % self
.__dict
__
184 ################################################################################
185 # predefined instances which can be used as length units
186 ################################################################################
188 # user lengths and unqualified length which are also user length
189 u_pt
= pt
= length(1, type="u", unit
="pt")
190 u_m
= m
= length(1, type="u", unit
="m")
191 u_mm
= mm
= length(1, type="u", unit
="mm")
192 u_cm
= cm
= length(1, type="u", unit
="cm")
193 u_inch
= inch
= length(1, type="u", unit
="inch")
196 t_pt
= length(1, type="t", unit
="pt")
197 t_m
= length(1, type="t", unit
="m")
198 t_mm
= length(1, type="t", unit
="mm")
199 t_cm
= length(1, type="t", unit
="cm")
200 t_inch
= length(1, type="t", unit
="inch")
203 v_pt
= length(1, type="v", unit
="pt")
204 v_m
= length(1, type="v", unit
="m")
205 v_mm
= length(1, type="v", unit
="mm")
206 v_cm
= length(1, type="v", unit
="cm")
207 v_inch
= length(1, type="v", unit
="inch")
210 w_pt
= length(1, type="w", unit
="pt")
211 w_m
= length(1, type="w", unit
="m")
212 w_mm
= length(1, type="w", unit
="mm")
213 w_cm
= length(1, type="w", unit
="cm")
214 w_inch
= length(1, type="w", unit
="inch")
217 x_pt
= length(1, type="x", unit
="pt")
218 x_m
= length(1, type="x", unit
="m")
219 x_mm
= length(1, type="x", unit
="mm")
220 x_cm
= length(1, type="x", unit
="cm")
221 x_inch
= length(1, type="x", unit
="inch")