Skip to content

Commit 66d67ec

Browse files
committed
Refactor out the unique plot ID generation for slicers
1 parent af6670e commit 66d67ec

File tree

5 files changed

+35
-59
lines changed

5 files changed

+35
-59
lines changed

src/sas/qtgui/Plotting/Slicers/AnnulusSlicer.py

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import sas.qtgui.Utilities.GuiUtils as GuiUtils
44
from sas.qtgui.Plotting.PlotterData import Data1D, DataRole
55
from sas.qtgui.Plotting.SlicerModel import SlicerModel
6+
from sas.qtgui.Plotting.Slicers.SlicerUtils import generate_unique_plot_id
67

78
from .BaseInteractor import BaseInteractor
89

@@ -137,21 +138,7 @@ def _post_data(self, nbins=None):
137138
# Assign unique id per slicer instance and use it as the display name
138139
if self._plot_id is None:
139140
base_id = "AnnulusPhi" + self.data.name
140-
parent_item = self._item
141-
if self._item.parent() is not None:
142-
parent_item = self._item.parent()
143-
existing = 0
144-
for i in range(parent_item.rowCount()):
145-
it = parent_item.child(i)
146-
d = it.data()
147-
if hasattr(d, "id") and isinstance(d.id, str) and d.id.startswith(base_id):
148-
existing += 1
149-
for j in range(it.rowCount()):
150-
it2 = it.child(j)
151-
d2 = it2.data()
152-
if hasattr(d2, "id") and isinstance(d2.id, str) and d2.id.startswith(base_id):
153-
existing += 1
154-
self._plot_id = base_id if existing == 0 else f"{base_id}_{existing+1}"
141+
self._plot_id = generate_unique_plot_id(base_id, self._item)
155142

156143
new_plot.id = self._plot_id
157144
new_plot.name = new_plot.id

src/sas/qtgui/Plotting/Slicers/BoxSlicer.py

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sas.qtgui.Plotting.PlotterData import Data1D
77
from sas.qtgui.Plotting.SlicerModel import SlicerModel
88
from sas.qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor
9+
from sas.qtgui.Plotting.Slicers.SlicerUtils import generate_unique_plot_id
910

1011
logger = logging.getLogger(__name__)
1112

@@ -262,21 +263,7 @@ def _post_data(self, new_slab=None, nbins=None, direction=None):
262263
# Assign unique id per slicer instance and use it as the display name
263264
if self._plot_id is None:
264265
base_id = "BoxAverage" + self.data.name
265-
parent_item = self._item
266-
if self._item.parent() is not None:
267-
parent_item = self._item.parent()
268-
existing = 0
269-
for i in range(parent_item.rowCount()):
270-
it = parent_item.child(i)
271-
d = it.data()
272-
if hasattr(d, "id") and isinstance(d.id, str) and d.id.startswith(base_id):
273-
existing += 1
274-
for j in range(it.rowCount()):
275-
it2 = it.child(j)
276-
d2 = it2.data()
277-
if hasattr(d2, "id") and isinstance(d2.id, str) and d2.id.startswith(base_id):
278-
existing += 1
279-
self._plot_id = base_id if existing == 0 else f"{base_id}_{existing+1}"
266+
self._plot_id = generate_unique_plot_id(base_id, self._item)
280267

281268
new_plot.id = self._plot_id
282269
new_plot.name = self._plot_id

src/sas/qtgui/Plotting/Slicers/SectorSlicer.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from sas.qtgui.Plotting.PlotterData import Data1D
55
from sas.qtgui.Plotting.SlicerModel import SlicerModel
66
from sas.qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor
7+
from sas.qtgui.Plotting.Slicers.SlicerUtils import generate_unique_plot_id
78

89
MIN_PHI = 0.05
910

@@ -174,22 +175,7 @@ def _post_data(self, nbins=None):
174175
# Assign unique id per slicer instance and use it as the display name
175176
if self._plot_id is None:
176177
base_id = "SectorQ" + self.data.name
177-
if self._item.parent() is None:
178-
parent_item = self._item
179-
else:
180-
parent_item = self._item.parent()
181-
existing = 0
182-
for i in range(parent_item.rowCount()):
183-
it = parent_item.child(i)
184-
d = it.data()
185-
if hasattr(d, "id") and isinstance(d.id, str) and d.id.startswith(base_id):
186-
existing += 1
187-
for j in range(it.rowCount()):
188-
it2 = it.child(j)
189-
d2 = it2.data()
190-
if hasattr(d2, "id") and isinstance(d2.id, str) and d2.id.startswith(base_id):
191-
existing += 1
192-
self._plot_id = base_id if existing == 0 else f"{base_id}_{existing+1}"
178+
self._plot_id = generate_unique_plot_id(base_id, self._item)
193179

194180
new_plot.id = self._plot_id
195181
new_plot.name = new_plot.id
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
Utility functions for slicers
3+
"""
4+
5+
def generate_unique_plot_id(base_id, item):
6+
"""
7+
Generate a unique plot ID by checking existing plots in the data tree.
8+
9+
:param base_id: The base identifier string (e.g., "SectorQ" + data.name)
10+
:param item: The current item in the data explorer tree
11+
:return: A unique ID string, either base_id or base_id_N where N is a number
12+
"""
13+
parent_item = item if item.parent() is None else item.parent()
14+
15+
existing = 0
16+
for i in range(parent_item.rowCount()):
17+
it = parent_item.child(i)
18+
d = it.data()
19+
if hasattr(d, "id") and isinstance(d.id, str) and d.id.startswith(base_id):
20+
existing += 1
21+
for j in range(it.rowCount()):
22+
it2 = it.child(j)
23+
d2 = it2.data()
24+
if hasattr(d2, "id") and isinstance(d2.id, str) and d2.id.startswith(base_id):
25+
existing += 1
26+
27+
return base_id if existing == 0 else f"{base_id}_{existing + 1}"

src/sas/qtgui/Plotting/Slicers/WedgeSlicer.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from sas.qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor
88
from sas.qtgui.Plotting.Slicers.RadiusInteractor import RadiusInteractor
99
from sas.qtgui.Plotting.Slicers.SectorSlicer import LineInteractor
10+
from sas.qtgui.Plotting.Slicers.SlicerUtils import generate_unique_plot_id
1011

1112

1213
class WedgeInteractor(BaseInteractor, SlicerModel):
@@ -213,19 +214,7 @@ def _post_data(self, new_sector=None, nbins=None):
213214
# Assign unique id per slicer instance and use it as the display name
214215
if self.plot_id is None:
215216
base_id = "Wedge" + self.averager.__name__ + self.data.name
216-
parent_item = self._item if self._item.parent() is None else self._item.parent()
217-
existing = 0
218-
for i in range(parent_item.rowCount()):
219-
item = parent_item.child(i)
220-
data = item.data()
221-
if hasattr(data, "id") and isinstance(data.id, str) and data.id.startswith(base_id):
222-
existing += 1
223-
for j in range(item.rowCount()):
224-
item2 = item.child(j)
225-
data2 = item2.data()
226-
if hasattr(data2, "id") and isinstance(data2.id, str) and data2.id.startswith(base_id):
227-
existing += 1
228-
self.plot_id = base_id if existing == 0 else f"{base_id}_{existing+1}"
217+
self.plot_id = generate_unique_plot_id(base_id, self._item)
229218

230219
new_plot.id = self.plot_id
231220
new_plot.name = new_plot.id

0 commit comments

Comments
 (0)