feat(plot): configure one or two marker pairs per axis

This commit is contained in:
2026-09-04 12:56:16 +03:00
parent 5f8fc07f2a
commit f6787163dc
4 changed files with 31 additions and 2 deletions

View File

@@ -102,6 +102,8 @@ class Bounds:
class Markers:
x_enabled: bool = True
y_enabled: bool = False
x_pairs: int = 1
y_pairs: int = 1
selected: Marker = Marker.A
a: Optional[float] = None
b: Optional[float] = None
@@ -112,11 +114,21 @@ class Markers:
g: Optional[float] = None
h: Optional[float] = None
def __post_init__(self) -> None:
if self.x_pairs not in (1, 2) or self.y_pairs not in (1, 2):
raise ValueError("Marker pair count must be 1 or 2")
def value(self, marker: Marker) -> Optional[float]:
return getattr(self, marker.name.lower())
def enabled(self, marker: Marker) -> bool:
return self.y_enabled if marker.horizontal else self.x_enabled
if marker in (Marker.A, Marker.B):
return self.x_enabled
if marker in (Marker.C, Marker.D):
return self.x_enabled and self.x_pairs >= 2
if marker in (Marker.E, Marker.F):
return self.y_enabled
return self.y_enabled and self.y_pairs >= 2
def move(self, marker: Marker, value: float) -> "Markers":
return replace(self, **{marker.name.lower(): value})

View File

@@ -5,6 +5,7 @@ import math
import os
from pathlib import Path
import unittest
from dataclasses import replace
from protocan.plot import Bounds, Marker, Markers, PlotMath, Viewport
@@ -31,6 +32,9 @@ class PlotTests(unittest.TestCase):
def test_markers_stay_in_data_coordinates_and_cross(self):
bounds = Bounds(1000, 2000, -10, 10)
markers = Markers().positioned(self.core, bounds)
self.assertTrue(markers.enabled(Marker.A))
self.assertFalse(markers.enabled(Marker.C))
self.assertTrue(replace(markers, x_pairs=2).enabled(Marker.C))
zoomed = bounds.visible(self.core, Viewport(.25, .25, .5, .5))
self.assertEqual(markers, markers.positioned(self.core, zoomed))
moved = markers.drag(self.core, Marker.A, 50, 500, zoomed)