| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent b3499b2 commit 7b454c2
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -210,22 +210,20 @@ def demo(): | |||
| 210 | 210 | 'CapStyle': CapStyle.input_description}) | |
| 211 | 211 | ||
| 212 | 212 | ||
| 213 | - def _get_dash_pattern(style): | ||
| 214 | - """Convert linestyle to dash pattern.""" | ||
| 215 | - # import must be local for validator code to live here | ||
| 216 | - from . import rcParams | ||
| 217 | - # un-dashed styles | ||
| 218 | - if style in ['solid', 'None']: | ||
| 219 | - offset = 0 | ||
| 220 | - dashes = None | ||
| 221 | - # dashed styles | ||
| 222 | - elif style in ['dashed', 'dashdot', 'dotted']: | ||
| 223 | - offset = 0 | ||
| 224 | - dashes = tuple(rcParams['lines.{}_pattern'.format(style)]) | ||
| 225 | - return offset, dashes | ||
| 226 | - | ||
| 227 | - | ||
| 228 | - class LineStyle(Enum): | ||
| 213 | + #: Maps short codes for line style to their full name used by backends. | ||
| 214 | + _ls_mapper = {'-': 'solid', '--': 'dashed', '-.': 'dashdot', ':': 'dotted'} | ||
| 215 | + _deprecated_lineStyles = { # hidden names deprecated | ||
| 216 | + '-': '_draw_solid', | ||
| 217 | + '--': '_draw_dashed', | ||
| 218 | + '-.': '_draw_dash_dot', | ||
| 219 | + ':': '_draw_dotted', | ||
| 220 | + 'None': '_draw_nothing', | ||
| 221 | + ' ': '_draw_nothing', | ||
| 222 | + '': '_draw_nothing', | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + | ||
| 226 | + class LineStyle(str, Enum): | ||
| 229 | 227 | """ | |
| 230 | 228 | Describe if the line is solid or dashed, and the dash pattern, if any. | |
| 231 | 229 | ||
@@ -285,19 +283,6 @@ class LineStyle(Enum): | |||
| 285 | 283 | none = 'None' | |
| 286 | 284 | _custom = 'custom' | |
| 287 | 285 | ||
| 288 | - _deprecated_lineStyles = { # hidden names deprecated | ||
| 289 | - '-': '_draw_solid', | ||
| 290 | - '--': '_draw_dashed', | ||
| 291 | - '-.': '_draw_dash_dot', | ||
| 292 | - ':': '_draw_dotted', | ||
| 293 | - 'None': '_draw_nothing', | ||
| 294 | - ' ': '_draw_nothing', | ||
| 295 | - '': '_draw_nothing', | ||
| 296 | - } | ||
| 297 | - | ||
| 298 | - #: Maps short codes for line style to their full name used by backends. | ||
| 299 | - ls_mapper = {'-': 'solid', '--': 'dashed', '-.': 'dashdot', ':': 'dotted'} | ||
| 300 | - | ||
| 301 | 286 | def __init__(self, ls, scale=1): | |
| 302 | 287 | """ | |
| 303 | 288 | Parameters | |
@@ -312,13 +297,14 @@ def __init__(self, ls, scale=1): | |||
| 312 | 297 | factor. | |
| 313 | 298 | """ | |
| 314 | 299 | ||
| 300 | + self._linestyle_spec = ls | ||
| 315 | 301 | if isinstance(ls, str): | |
| 316 | 302 | if ls in [' ', '', 'none']: | |
| 317 | 303 | ls = 'None' | |
| 318 | - if ls in LineStyle.ls_mapper: | ||
| 319 | - ls = LineStyle.ls_mapper[ls] | ||
| 304 | + if ls in _ls_mapper: | ||
| 305 | + ls = _ls_mapper[ls] | ||
| 320 | 306 | Enum.__init__(self) | |
| 321 | - offset, onoffseq = _get_dash_pattern(ls) | ||
| 307 | + offset, onoffseq = None, None | ||
| 322 | 308 | else: | |
| 323 | 309 | try: | |
| 324 | 310 | offset, onoffseq = ls | |
@@ -342,22 +328,45 @@ def __init__(self, ls, scale=1): | |||
| 342 | 328 | if not all(isinstance(elem, Number) for elem in onoffseq): | |
| 343 | 329 | raise ValueError('LineStyle onoffseq must be list of floats.') | |
| 344 | 330 | self._us_offset = offset | |
| 345 | - self._us_onoffseq = dashes | ||
| 346 | - self.scale(scale) | ||
| 347 | - | ||
| 348 | - @property | ||
| 349 | - def scale(self): | ||
| 350 | - return self._scale | ||
| 351 | - | ||
| 352 | - @scale.setter | ||
| 353 | - def scale(self, s): | ||
| 354 | - if s < 0: | ||
| 355 | - raise ValueError('LineStyle cannot be scaled by a negative value.') | ||
| 356 | - self.offset = self._us_offset * s | ||
| 357 | - self.onoffseq = ( | ||
| 358 | - [x * s if x is not None else None for x in self._us_onoffseq] | ||
| 359 | - if self._us_onoffseq is not None else None | ||
| 360 | - ) | ||
| 331 | + self._us_onoffseq = onoffseq | ||
| 332 | + | ||
| 333 | + def get_dashes(self, lw=1): | ||
| 334 | + """ | ||
| 335 | + Get the (scaled) dash sequence for this `.LineStyle`. | ||
| 336 | + """ | ||
| 337 | + # defer lookup until draw time | ||
| 338 | + if self._us_offset is None or self._us_onoffseq is None: | ||
| 339 | + self._us_offset, self._us_onoffseq = \ | ||
| 340 | + LineStyle._get_dash_pattern(self.name) | ||
| 341 | + # normalize offset to be positive and shorter than the dash cycle | ||
| 342 | + dsum = sum(self._us_onoffseq) | ||
| 343 | + self._us_offset %= dsum | ||
| 344 | + return self._scale_dashes(self._us_offset, self._us_onoffseq, lw) | ||
| 345 | + | ||
| 346 | + @staticmethod | ||
| 347 | + def _scale_dashes(offset, dashes, lw): | ||
| 348 | + from . import rcParams | ||
| 349 | + if not rcParams['lines.scale_dashes']: | ||
| 350 | + return offset, dashes | ||
| 351 | + scaled_offset = offset * lw | ||
| 352 | + scaled_dashes = ([x * lw if x is not None else None for x in dashes] | ||
| 353 | + if dashes is not None else None) | ||
| 354 | + return scaled_offset, scaled_dashes | ||
| 355 | + | ||
| 356 | + @staticmethod | ||
| 357 | + def _get_dash_pattern(style): | ||
| 358 | + """Convert linestyle string to explicit dash pattern.""" | ||
| 359 | + # import must be local for validator code to live here | ||
| 360 | + from . import rcParams | ||
| 361 | + # un-dashed styles | ||
| 362 | + if style in ['solid', 'None']: | ||
| 363 | + offset = 0 | ||
| 364 | + dashes = None | ||
| 365 | + # dashed styles | ||
| 366 | + elif style in ['dashed', 'dashdot', 'dotted']: | ||
| 367 | + offset = 0 | ||
| 368 | + dashes = tuple(rcParams['lines.{}_pattern'.format(style)]) | ||
| 369 | + return offset, dashes | ||
| 361 | 370 | ||
| 362 | 371 | @staticmethod | |
| 363 | 372 | def from_dashes(seq): | |
@@ -443,3 +452,7 @@ def plot_linestyles(ax, linestyles, title): | |||
| 443 | 452 | ||
| 444 | 453 | plt.tight_layout() | |
| 445 | 454 | plt.show() | |
| 455 | + | ||
| 456 | + | ||
| 457 | + LineStyle._ls_mapper = _ls_mapper | ||
| 458 | + LineStyle._deprecated_lineStyles = _deprecated_lineStyles | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -17,7 +17,7 @@ | |||
| 17 | 17 | from .path import Path | |
| 18 | 18 | from .transforms import ( | |
| 19 | 19 | Affine2D, Bbox, BboxTransformFrom, BboxTransformTo, TransformedPath) | |
| 20 | - from ._types import JoinStyle, CapStyle | ||
| 20 | + from ._types import JoinStyle, CapStyle, LineStyle | ||
| 21 | 21 | ||
| 22 | 22 | # Imported here for backward compatibility, even though they don't | |
| 23 | 23 | # really belong. | |
@@ -308,14 +308,6 @@ def __init__(self, xdata, ydata, | |||
| 308 | 308 | self._drawstyle = None | |
| 309 | 309 | self._linewidth = linewidth | |
| 310 | 310 | ||
| 311 | - # scaled dash + offset | ||
| 312 | - self._dashSeq = None | ||
| 313 | - self._dashOffset = 0 | ||
| 314 | - # unscaled dash + offset | ||
| 315 | - # this is needed scaling the dash pattern by linewidth | ||
| 316 | - self._us_dashSeq = None | ||
| 317 | - self._us_dashOffset = 0 | ||
| 318 | - | ||
| 319 | 311 | self.set_linewidth(linewidth) | |
| 320 | 312 | self.set_linestyle(linestyle) | |
| 321 | 313 | self.set_drawstyle(drawstyle) | |
@@ -739,7 +731,7 @@ def draw(self, renderer): | |||
| 739 | 731 | if self.get_sketch_params() is not None: | |
| 740 | 732 | gc.set_sketch_params(*self.get_sketch_params()) | |
| 741 | 733 | ||
| 742 | - gc.set_dashes(self._dashOffset, self._dashSeq) | ||
| 734 | + gc.set_dashes(*self._linestyle.get_dashes(self._linewidth)) | ||
| 743 | 735 | renderer.draw_path(gc, tpath, affine.frozen()) | |
| 744 | 736 | gc.restore() | |
| 745 | 737 | ||
@@ -1191,7 +1183,7 @@ def set_ydata(self, y): | |||
| 1191 | 1183 | def set_dashes(self, seq): | |
| 1192 | 1184 | self.set_linestyle(LineStyle.from_dashes(seq)) | |
| 1193 | 1185 | ||
| 1194 | - set_dashes.__doc__ = LineStyle.from_dashes.__doc_r | ||
| 1186 | + set_dashes.__doc__ = LineStyle.from_dashes.__doc__ | ||
| 1195 | 1187 | ||
| 1196 | 1188 | def update_from(self, other): | |
| 1197 | 1189 | """Copy properties from *other* to self.""" | |
@@ -1204,10 +1196,6 @@ def update_from(self, other): | |||
| 1204 | 1196 | self._markerfacecoloralt = other._markerfacecoloralt | |
| 1205 | 1197 | self._markeredgecolor = other._markeredgecolor | |
| 1206 | 1198 | self._markeredgewidth = other._markeredgewidth | |
| 1207 | - self._dashSeq = other._dashSeq | ||
| 1208 | - self._us_dashSeq = other._us_dashSeq | ||
| 1209 | - self._dashOffset = other._dashOffset | ||
| 1210 | - self._us_dashOffset = other._us_dashOffset | ||
| 1211 | 1199 | self._dashcapstyle = other._dashcapstyle | |
| 1212 | 1200 | self._dashjoinstyle = other._dashjoinstyle | |
| 1213 | 1201 | self._solidcapstyle = other._solidcapstyle | |
| Back | FazBrowse Home | New Git URL |
0 commit comments