kaxe 1.4.4.dev14__tar.gz → 1.4.5.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kaxe-1.4.4.dev14/src/kaxe.egg-info → kaxe-1.4.5.dev0}/PKG-INFO +1 -1
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/pyproject.toml +1 -1
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/axis.py +0 -1
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/helper.py +0 -31
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/svg.py +14 -74
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/window.py +3 -36
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/function.py +0 -2
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/point.py +12 -21
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/grid.py +2 -25
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0/src/kaxe.egg-info}/PKG-INFO +1 -1
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/LICENSE +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/MANIFEST.in +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/README.md +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/setup.cfg +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/chart/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/chart/bar.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/chart/box.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/chart/pie.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/chart/qqplot.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/color.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/backend.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/camera.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/helper.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/hud.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/color.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/line.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/point.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/pointer.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/objects/triangle.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/openglrender.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/d3/translator.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/draw.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/fileloader.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/legend.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/line.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/marker.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/profiler.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/round.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/shapes.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/styles.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/svg_pdf.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/symbol.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/core/text.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/data/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/data/excel.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/_lazy.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/arrow.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/bubble.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/contour.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/equation.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/fill.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/map.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/parameter.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d2/pillar.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/base.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/function.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/mesh.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/point.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/d3/potato.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/function.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/legend.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/mapdata.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/point.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/objects/text.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/_lazy.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/box.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/constants.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/d3/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/d3/axes.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/d3/geometry.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/d3/plot3d.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/d3/variants.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/double.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/empty.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/log.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/polar.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/standard.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/themes.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/zoom.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/plot/zoom_connector.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/__init__.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.bright-oblique.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.bright-roman.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.bright-semibold.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.bright-semiboldoblique.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.classical-serif-italic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.concrete-bold.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.concrete-bolditalic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.concrete-italic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.concrete-roman.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-bold.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-boldoblique.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-demi-condensed-demicondensed.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-medium.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-oblique.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-bold.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-bolditalic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-extra-boldslanted.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-extra-romanslanted.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-italic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-roman.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-upright-italic-uprightitalic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-bold.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-bolditalic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-italic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-light.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-lightoblique.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-regular.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-variable-width-italic.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-variable-width-medium.ttf +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/readme.txt +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/logo-small.png +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/symbolcross.png +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/symboldonut.png +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/symbollollipop.png +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/symboltriangle.png +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe.egg-info/SOURCES.txt +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe.egg-info/dependency_links.txt +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe.egg-info/requires.txt +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe.egg-info/top_level.txt +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/tests/test.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/tests/test2.py +0 -0
- {kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/tests/test3.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kaxe
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.5.dev0
|
|
4
4
|
Summary: A small graphing tool for functions, points, equations and more
|
|
5
5
|
Author-email: Valter Yde Daugberg <valteryde@hotmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/valteryde/kaxe
|
|
@@ -127,37 +127,6 @@ def insideBox(box, point):
|
|
|
127
127
|
return True
|
|
128
128
|
|
|
129
129
|
|
|
130
|
-
def segment_break_threshold(parent) -> float:
|
|
131
|
-
"""Pixel y delta above which a new polyline segment should start."""
|
|
132
|
-
box = parent.windowBox
|
|
133
|
-
return (box[3] - box[1]) * 0.45
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def should_break_polyline_segment(
|
|
137
|
-
p1: tuple[float, float],
|
|
138
|
-
p2: tuple[float, float],
|
|
139
|
-
parent,
|
|
140
|
-
) -> bool:
|
|
141
|
-
"""Break when a segment looks like a wrap-around, not a normal diagonal."""
|
|
142
|
-
dx = abs(p2[0] - p1[0])
|
|
143
|
-
dy = abs(p2[1] - p1[1])
|
|
144
|
-
if dy <= segment_break_threshold(parent):
|
|
145
|
-
return False
|
|
146
|
-
return dy > dx * 1.5
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
def plot_window_clip_rect_svg(plot) -> tuple[float, float, float, float]:
|
|
150
|
-
"""Return plot windowBox as an SVG clip rect (x, y, width, height), y-down."""
|
|
151
|
-
box = plot.windowBox
|
|
152
|
-
canvas_h = plot.getSize()[1]
|
|
153
|
-
return (
|
|
154
|
-
float(box[0]),
|
|
155
|
-
float(canvas_h - box[3]),
|
|
156
|
-
float(box[2] - box[0]),
|
|
157
|
-
float(box[3] - box[1]),
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
|
|
161
130
|
def shell(a):
|
|
162
131
|
def __shell__():
|
|
163
132
|
return a
|
|
@@ -57,9 +57,6 @@ class SvgDocument:
|
|
|
57
57
|
self._width, self._height = int(size[0]), int(size[1])
|
|
58
58
|
self._elements: list[ET.Element] = []
|
|
59
59
|
self._fondi_font_css: Optional[str] = None
|
|
60
|
-
self._clip_defs: list[ET.Element] = []
|
|
61
|
-
self._clip_counter = 0
|
|
62
|
-
self._active_group: Optional[ET.Element] = None
|
|
63
60
|
|
|
64
61
|
@property
|
|
65
62
|
def height(self) -> int:
|
|
@@ -72,48 +69,12 @@ class SvgDocument:
|
|
|
72
69
|
def flip_y(self, y: float) -> float:
|
|
73
70
|
return flip_y(y, self._height)
|
|
74
71
|
|
|
75
|
-
def _register_clip_rect(self, x: float, y: float, width: float, height: float) -> str:
|
|
76
|
-
clip_id = f"kaxe-clip-{self._clip_counter}"
|
|
77
|
-
self._clip_counter += 1
|
|
78
|
-
clip_path = ET.Element(
|
|
79
|
-
f"{{{SVG_NS}}}clipPath",
|
|
80
|
-
{"id": clip_id},
|
|
81
|
-
)
|
|
82
|
-
ET.SubElement(
|
|
83
|
-
clip_path,
|
|
84
|
-
f"{{{SVG_NS}}}rect",
|
|
85
|
-
{
|
|
86
|
-
"x": str(round(x, 3)),
|
|
87
|
-
"y": str(round(y, 3)),
|
|
88
|
-
"width": str(round(width, 3)),
|
|
89
|
-
"height": str(round(height, 3)),
|
|
90
|
-
},
|
|
91
|
-
)
|
|
92
|
-
self._clip_defs.append(clip_path)
|
|
93
|
-
return clip_id
|
|
94
|
-
|
|
95
|
-
def push_clip_layer(self, x: float, y: float, width: float, height: float) -> None:
|
|
96
|
-
"""Clip subsequent elements to a rectangle in SVG top-down coordinates."""
|
|
97
|
-
clip_id = self._register_clip_rect(x, y, width, height)
|
|
98
|
-
group = ET.Element(
|
|
99
|
-
f"{{{SVG_NS}}}g",
|
|
100
|
-
{"clip-path": f"url(#{clip_id})"},
|
|
101
|
-
)
|
|
102
|
-
self._elements.append(group)
|
|
103
|
-
self._active_group = group
|
|
104
|
-
|
|
105
|
-
def pop_clip_layer(self) -> None:
|
|
106
|
-
self._active_group = None
|
|
107
|
-
|
|
108
72
|
def add_element(self, tag: str, attribs: dict[str, Any]) -> ET.Element:
|
|
109
73
|
el = ET.Element(
|
|
110
74
|
f"{{{SVG_NS}}}{tag}",
|
|
111
75
|
{k: str(v) for k, v in attribs.items() if v is not None},
|
|
112
76
|
)
|
|
113
|
-
|
|
114
|
-
self._active_group.append(el)
|
|
115
|
-
else:
|
|
116
|
-
self._elements.append(el)
|
|
77
|
+
self._elements.append(el)
|
|
117
78
|
return el
|
|
118
79
|
|
|
119
80
|
def add_rect(
|
|
@@ -324,11 +285,9 @@ class SvgDocument:
|
|
|
324
285
|
rotate: float = 0,
|
|
325
286
|
rotate_center: Optional[tuple[float, float]] = None,
|
|
326
287
|
) -> None:
|
|
327
|
-
"""Place an image; y is in kaxe coords (y-up)
|
|
288
|
+
"""Place an image; y is in kaxe coords (y-up). y_coord='bottom' or 'top'."""
|
|
328
289
|
href = pil_to_data_uri(img)
|
|
329
|
-
if y_coord == "
|
|
330
|
-
svg_top = y
|
|
331
|
-
elif y_coord == "top":
|
|
290
|
+
if y_coord == "top":
|
|
332
291
|
svg_top = self.flip_y(y)
|
|
333
292
|
else:
|
|
334
293
|
svg_top = self.flip_y(y) - img.height
|
|
@@ -388,10 +347,7 @@ class SvgDocument:
|
|
|
388
347
|
group = ET.Element(f"{{{SVG_NS}}}g", {"transform": transform})
|
|
389
348
|
for child in list(inner):
|
|
390
349
|
group.append(copy.deepcopy(child))
|
|
391
|
-
|
|
392
|
-
self._active_group.append(group)
|
|
393
|
-
else:
|
|
394
|
-
self._elements.append(group)
|
|
350
|
+
self._elements.append(group)
|
|
395
351
|
|
|
396
352
|
def serialize(self) -> str:
|
|
397
353
|
root = ET.Element(
|
|
@@ -403,22 +359,15 @@ class SvgDocument:
|
|
|
403
359
|
"viewBox": f"0 0 {self._width} {self._height}",
|
|
404
360
|
},
|
|
405
361
|
)
|
|
406
|
-
if self._fondi_font_css is not None
|
|
362
|
+
if self._fondi_font_css is not None:
|
|
407
363
|
defs = ET.SubElement(root, f"{{{SVG_NS}}}defs")
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
style.text = self._fondi_font_css
|
|
411
|
-
for clip_el in self._clip_defs:
|
|
412
|
-
defs.append(clip_el)
|
|
364
|
+
style = ET.SubElement(defs, f"{{{SVG_NS}}}style")
|
|
365
|
+
style.text = self._fondi_font_css
|
|
413
366
|
for el in self._elements:
|
|
414
367
|
root.append(el)
|
|
415
368
|
body = ET.tostring(root, encoding="unicode")
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
body = _ascii_safe_svg_markup(body)
|
|
420
|
-
except ImportError:
|
|
421
|
-
pass
|
|
369
|
+
from fondi.backends.svg import _ascii_safe_svg_markup
|
|
370
|
+
body = _ascii_safe_svg_markup(body)
|
|
422
371
|
return '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + body
|
|
423
372
|
|
|
424
373
|
def to_pdf(self, fname: Optional[Union[str, BytesIO]] = None) -> bytes:
|
|
@@ -459,23 +408,14 @@ def embed_svg_children(
|
|
|
459
408
|
children: list[ET.Element],
|
|
460
409
|
tx: float,
|
|
461
410
|
ty: float,
|
|
462
|
-
*,
|
|
463
|
-
clip_rect: Optional[tuple[float, float, float, float]] = None,
|
|
464
411
|
) -> None:
|
|
465
|
-
"""Embed copied SVG children at top-left offset (SVG y-down coordinates).
|
|
466
|
-
|
|
467
|
-
clip_rect is optional (x, y, width, height) in the embedded cell's local SVG space.
|
|
468
|
-
"""
|
|
412
|
+
"""Embed copied SVG children at top-left offset (SVG y-down coordinates)."""
|
|
469
413
|
if not children:
|
|
470
414
|
return
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
cx, cy, cw, ch = clip_rect
|
|
476
|
-
clip_id = doc._register_clip_rect(cx, cy, cw, ch)
|
|
477
|
-
attribs["clip-path"] = f"url(#{clip_id})"
|
|
478
|
-
group = ET.Element(f"{{{SVG_NS}}}g", attribs)
|
|
415
|
+
group = ET.Element(
|
|
416
|
+
f"{{{SVG_NS}}}g",
|
|
417
|
+
{"transform": f"translate({round(tx, 3)},{round(ty, 3)})"},
|
|
418
|
+
)
|
|
479
419
|
for child in children:
|
|
480
420
|
group.append(copy.deepcopy(child))
|
|
481
421
|
doc._elements.append(group)
|
|
@@ -418,8 +418,7 @@ class Window(AttrObject):
|
|
|
418
418
|
self.__includeAllAgain__()
|
|
419
419
|
|
|
420
420
|
|
|
421
|
-
self.
|
|
422
|
-
self.shapes = [i[0] for i in self.shape_layers]
|
|
421
|
+
self.shapes = [i[0] for i in sorted(self.shapes, key=lambda x: x[1])]
|
|
423
422
|
|
|
424
423
|
# add style padding
|
|
425
424
|
self.addPaddingCondition(*self.getAttr('outerPadding'))
|
|
@@ -495,23 +494,7 @@ class Window(AttrObject):
|
|
|
495
494
|
background = shapes.Rectangle(0, 0, winSize[0], winSize[1], color=self.getAttr('backgroundColor'))
|
|
496
495
|
background.draw(doc)
|
|
497
496
|
|
|
498
|
-
|
|
499
|
-
doc.push_clip_layer(
|
|
500
|
-
box[0],
|
|
501
|
-
winSize[1] - box[3],
|
|
502
|
-
box[2] - box[0],
|
|
503
|
-
box[3] - box[1],
|
|
504
|
-
)
|
|
505
|
-
for shape, z in getattr(self, "shape_layers", [(s, 0) for s in self.shapes]):
|
|
506
|
-
if z >= 2:
|
|
507
|
-
continue
|
|
508
|
-
shape.draw(doc)
|
|
509
|
-
if self.showProgressBar: pbar.update()
|
|
510
|
-
doc.pop_clip_layer()
|
|
511
|
-
|
|
512
|
-
for shape, z in getattr(self, "shape_layers", [(s, 0) for s in self.shapes]):
|
|
513
|
-
if z < 2:
|
|
514
|
-
continue
|
|
497
|
+
for shape in self.shapes:
|
|
515
498
|
shape.draw(doc)
|
|
516
499
|
if self.showProgressBar: pbar.update()
|
|
517
500
|
|
|
@@ -541,23 +524,7 @@ class Window(AttrObject):
|
|
|
541
524
|
background = shapes.Rectangle(0, 0, winSize[0], winSize[1], color=self.getAttr('backgroundColor'))
|
|
542
525
|
background.draw(doc)
|
|
543
526
|
|
|
544
|
-
|
|
545
|
-
doc.push_clip_layer(
|
|
546
|
-
box[0],
|
|
547
|
-
winSize[1] - box[3],
|
|
548
|
-
box[2] - box[0],
|
|
549
|
-
box[3] - box[1],
|
|
550
|
-
)
|
|
551
|
-
for shape, z in getattr(self, "shape_layers", [(s, 0) for s in self.shapes]):
|
|
552
|
-
if z >= 2:
|
|
553
|
-
continue
|
|
554
|
-
shape.draw(doc)
|
|
555
|
-
if self.showProgressBar: pbar.update()
|
|
556
|
-
doc.pop_clip_layer()
|
|
557
|
-
|
|
558
|
-
for shape, z in getattr(self, "shape_layers", [(s, 0) for s in self.shapes]):
|
|
559
|
-
if z < 2:
|
|
560
|
-
continue
|
|
527
|
+
for shape in self.shapes:
|
|
561
528
|
shape.draw(doc)
|
|
562
529
|
if self.showProgressBar: pbar.update()
|
|
563
530
|
|
|
@@ -130,8 +130,6 @@ class Function2D:
|
|
|
130
130
|
)
|
|
131
131
|
|
|
132
132
|
if parent.inside(px, py) or parent.inside(*self.__lastPoint__):
|
|
133
|
-
if should_break_polyline_segment(self.__lastPoint__, (px, py), parent):
|
|
134
|
-
self.lineSegments.append([])
|
|
135
133
|
self.lineSegments[-1].append(parent.clamp(self.__lastPoint__[0], self.__lastPoint__[1]))
|
|
136
134
|
self.lineSegments[-1].append(parent.clamp(px, py))
|
|
137
135
|
else:
|
|
@@ -136,34 +136,25 @@ class Points2D:
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
def __finalizeConnectedLine__(self, parent, line_width):
|
|
139
|
-
|
|
139
|
+
points = []
|
|
140
140
|
for x_val, y_val in zip(self.x, self.y):
|
|
141
141
|
px, py = parent.pixel(x_val, y_val)
|
|
142
142
|
if px is None or py is None:
|
|
143
143
|
continue
|
|
144
144
|
if not parent.inside(px, py):
|
|
145
145
|
continue
|
|
146
|
-
|
|
147
|
-
if segments[-1] and should_break_polyline_segment(segments[-1][-1], point, parent):
|
|
148
|
-
segments.append([])
|
|
149
|
-
segments[-1].append(point)
|
|
146
|
+
points.append(parent.clamp(px, py))
|
|
150
147
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
batch=self.batch,
|
|
162
|
-
center=True,
|
|
163
|
-
)
|
|
164
|
-
self.lines.append(line)
|
|
165
|
-
continue
|
|
166
|
-
shapes.LineSegment(points, color=self.color, width=line_width, batch=self.batch)
|
|
148
|
+
if len(points) < 2:
|
|
149
|
+
return
|
|
150
|
+
if len(points) == 2:
|
|
151
|
+
x0, y0 = points[0]
|
|
152
|
+
x1, y1 = points[1]
|
|
153
|
+
line = shapes.Line(x0, y0, x1, y1, color=self.color, width=line_width, batch=self.batch, center=True)
|
|
154
|
+
self.lines.append(line)
|
|
155
|
+
return
|
|
156
|
+
|
|
157
|
+
shapes.LineSegment(points, color=self.color, width=line_width, batch=self.batch)
|
|
167
158
|
|
|
168
159
|
|
|
169
160
|
def draw(self, *args, **kwargs):
|
|
@@ -94,7 +94,6 @@ class Grid(AttrObject):
|
|
|
94
94
|
"""
|
|
95
95
|
|
|
96
96
|
self.__legends = legends
|
|
97
|
-
self._invalidate_bake_cache()
|
|
98
97
|
|
|
99
98
|
|
|
100
99
|
def theme(self, theme):
|
|
@@ -111,23 +110,10 @@ class Grid(AttrObject):
|
|
|
111
110
|
plot.__included__ = []
|
|
112
111
|
plot.__baked__ = False
|
|
113
112
|
plot.__bakedImage__ = False
|
|
114
|
-
if hasattr(plot, "shape_layers"):
|
|
115
|
-
plot.shape_layers = []
|
|
116
|
-
for axis in (getattr(plot, "firstAxis", None), getattr(plot, "secondAxis", None)):
|
|
117
|
-
if axis is not None:
|
|
118
|
-
axis.markers = []
|
|
119
|
-
axis.title = None
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def _invalidate_bake_cache(self):
|
|
123
|
-
self.__bakedImage__ = False
|
|
124
|
-
self.__bakedSvg__ = None
|
|
125
|
-
self.__bakedPdf__ = None
|
|
126
113
|
|
|
127
114
|
|
|
128
115
|
def _apply_cell_styles(self, plot, cellWidth, cellHeight):
|
|
129
116
|
self._reset_cell_bake_state(plot)
|
|
130
|
-
plot.showLegend = False
|
|
131
117
|
plot.style(
|
|
132
118
|
width=cellWidth,
|
|
133
119
|
height=cellHeight,
|
|
@@ -329,18 +315,12 @@ class Grid(AttrObject):
|
|
|
329
315
|
xml = plot.__ioBytes.read().decode("utf-8")
|
|
330
316
|
root = parse_svg_root(xml)
|
|
331
317
|
children, fondi_css = extract_svg_children(root)
|
|
332
|
-
embed_svg_children(
|
|
333
|
-
doc,
|
|
334
|
-
children,
|
|
335
|
-
px,
|
|
336
|
-
py,
|
|
337
|
-
clip_rect=plot_window_clip_rect_svg(plot),
|
|
338
|
-
)
|
|
318
|
+
embed_svg_children(doc, children, px, py)
|
|
339
319
|
merge_fondi_css(doc, fondi_css)
|
|
340
320
|
else:
|
|
341
321
|
plot.__ioBytes.seek(0)
|
|
342
322
|
img = Image.open(plot.__ioBytes)
|
|
343
|
-
doc.add_image(img, px, py, y_coord="
|
|
323
|
+
doc.add_image(img, px, py, y_coord="top")
|
|
344
324
|
|
|
345
325
|
x += cellWidth + gapcol
|
|
346
326
|
|
|
@@ -384,7 +364,6 @@ class Grid(AttrObject):
|
|
|
384
364
|
|
|
385
365
|
"""
|
|
386
366
|
|
|
387
|
-
self._invalidate_bake_cache()
|
|
388
367
|
self.grid.append(row)
|
|
389
368
|
|
|
390
369
|
|
|
@@ -398,8 +377,6 @@ class Grid(AttrObject):
|
|
|
398
377
|
A list of plots to be added as a column in the grid.
|
|
399
378
|
"""
|
|
400
379
|
|
|
401
|
-
self._invalidate_bake_cache()
|
|
402
|
-
|
|
403
380
|
for i, plot in enumerate(column):
|
|
404
381
|
|
|
405
382
|
if i >= len(self.grid):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kaxe
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.5.dev0
|
|
4
4
|
Summary: A small graphing tool for functions, points, equations and more
|
|
5
5
|
Author-email: Valter Yde Daugberg <valteryde@hotmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/valteryde/kaxe
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.bright-roman.ttf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.concrete-bold.ttf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-bold.ttf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-italic.ttf
RENAMED
|
File without changes
|
{kaxe-1.4.4.dev14 → kaxe-1.4.5.dev0}/src/kaxe/resources/computer-modern-family/cmu.serif-roman.ttf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|