Skip to content

Commit df00773

Browse files
danielbolanleechwort
authored andcommitted
Implement logarithmic ticks and subticks.
1 parent 0885a91 commit df00773

File tree

2 files changed

+57
-14
lines changed

2 files changed

+57
-14
lines changed

render_knob_scale.inx

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
<item value="marks_outwards">Marks outwards</item>
2929
<item value="marks_circles">Dots</item>
3030
</param>
31+
<param name="logarithmic_ticks" type="bool" gui-text="Logarithmic ticks">false</param>
32+
<param name="logarithmic_subticks" type="bool" gui-text="Logarithmic subticks">false</param>
3133
</page>
3234
<page name="labels_settings" gui-text="Labels">
3335
<param name="labels_enabled" type="bool" gui-text="Enable labels">false</param>

render_knob_scale.py

+55-14
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ def __init__(self):
8181
type=str,
8282
dest="style", default='marks_outwards',
8383
help="Style of marks")
84+
self.arg_parser.add_argument("--logarithmic_ticks",
85+
type=inkex.Boolean,
86+
dest="logarithmic_ticks",
87+
default="False",
88+
help="Whether to space ticks according to a log scale.")
89+
self.arg_parser.add_argument("--logarithmic_subticks",
90+
type=inkex.Boolean,
91+
dest="logarithmic_subticks",
92+
default="False",
93+
help="Whether to space ticks according to a log scale. " \
94+
"Using this without the log-scale ticks will make " \
95+
"an exponential scale.")
8496

8597
# Label settings
8698
self.arg_parser.add_argument("--labels_enabled",
@@ -212,11 +224,22 @@ def draw_tick(self, radius, mark_angle, mark_size, parent):
212224
self.draw_circle_mark(self.x_offset, self.y_offset, radius, mark_angle, mark_size, parent)
213225

214226
def get_tick_angles(self):
215-
angle = radians(self.options.angle)
216227
n_ticks = self.options.n_ticks
217-
ticks_delta = angle / (n_ticks - 1)
228+
if n_ticks <= 0:
229+
return []
230+
231+
angle = radians(self.options.angle)
218232
start_angle = 1.5*pi - 0.5*angle
219-
return [start_angle + ticks_delta * i for i in range(n_ticks)]
233+
234+
if self.options.logarithmic_ticks:
235+
tick_angles = []
236+
for i in range(n_ticks):
237+
tick_angle = start_angle + angle*log(i+1)/log(n_ticks)
238+
tick_angles.append(tick_angle)
239+
return tick_angles
240+
else:
241+
ticks_delta = angle / (n_ticks - 1)
242+
return [start_angle + ticks_delta * i for i in range(n_ticks)]
220243

221244
def get_tick_labels(self):
222245
start_num = self.options.start_value
@@ -235,15 +258,32 @@ def get_tick_labels(self):
235258
return labels
236259

237260
def get_subtick_angles(self):
238-
angle = radians(self.options.angle)
261+
if self.options.n_ticks < 2:
262+
return []
263+
239264
n_ticks = self.options.n_ticks
240265
n_subticks = self.options.n_subticks
241-
ticks_delta = angle / (n_ticks - 1)
242-
subticks_delta = ticks_delta / (n_subticks + 1)
266+
angle = radians(self.options.angle)
267+
start_angle = 1.5*pi - 0.5*angle
268+
243269
subtick_angles = []
244-
for tick_angle in self.get_tick_angles()[:-1]:
245-
for subtick in range(n_subticks):
246-
subtick_angles.append(tick_angle + subticks_delta * (subtick + 1))
270+
tick_angles = self.get_tick_angles()
271+
for tick, cur_tick_angle in enumerate(tick_angles[:-1]):
272+
next_tick_angle = tick_angles[tick+1]
273+
tick_delta = next_tick_angle - cur_tick_angle
274+
if self.options.logarithmic_ticks:
275+
for i in range(n_subticks):
276+
fraction = (i+1) / (n_subticks+1) + tick
277+
fraction = log(fraction+1) / log(n_ticks)
278+
subtick_angles.append(start_angle + angle * fraction)
279+
elif self.options.logarithmic_subticks:
280+
for i in range(n_subticks):
281+
fraction = log(i+2) / log(n_subticks+2)
282+
subtick_angles.append(cur_tick_angle + tick_delta * fraction)
283+
else: # linear
284+
for i in range(n_subticks):
285+
fraction = (i + 1) / (n_subticks + 1)
286+
subtick_angles.append(cur_tick_angle + tick_delta * fraction)
247287
return subtick_angles
248288

249289
def effect(self):
@@ -280,18 +320,19 @@ def effect(self):
280320

281321
# Draw main ticks
282322
tick_angles = self.get_tick_angles()
283-
for angle in tick_angles:
284-
self.draw_tick(radius, angle, tick_length, parent)
323+
for tick_angle in tick_angles:
324+
self.draw_tick(radius, tick_angle, tick_length, parent)
325+
326+
# Draw subticks
327+
for subtick_angle in self.get_subtick_angles():
328+
self.draw_tick(subtick_radius, subtick_angle, subtick_length, parent)
285329

286330
if self.options.labels_enabled:
287331
labels = self.get_tick_labels()
288332
label_radius = radius + tick_length + text_spacing
289333
for angle, label in zip(tick_angles, labels):
290334
self.draw_text(label, label_radius, angle, text_size, parent)
291335

292-
# Draw subticks
293-
for angle in self.get_subtick_angles():
294-
self.draw_tick(subtick_radius, angle, subtick_length, parent)
295336

296337
if __name__ == '__main__':
297338
e = Knob_Scale()

0 commit comments

Comments
 (0)