Skip to content

Commit 3d1680b

Browse files
committed
Rotate and Flip added
1 parent 33bda73 commit 3d1680b

File tree

3 files changed

+291
-40
lines changed

3 files changed

+291
-40
lines changed

Diff for: Python Files/MatrixGenerator/MatrixGenerator.py

+67-40
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from eztk import setEntry, clearEntry
44
from random import randrange, shuffle, randint
55
import ez, ezs, os
6+
import numpy as np
67
from dialogs import *
78
from constants import *
89

@@ -91,6 +92,10 @@ def __init__(self, master):
9192
self.cmdMenu.add_command(label = MULTIPLY, accelerator = shortcuts[MULTIPLY], command = self.multiply)
9293
self.cmdMenu.add_separator()
9394
self.cmdMenu.add_command(label = TRANSPOSE, accelerator = shortcuts[TRANSPOSE], command = self.transpose)
95+
self.cmdMenu.add_command(label = f'Rotate ({CLOCKWISE})', command = lambda: self.rotate(CLOCKWISE))
96+
self.cmdMenu.add_command(label = f'Rotate ({COUNTER})', command = lambda: self.rotate(COUNTER))
97+
self.cmdMenu.add_command(label = f'Flip ({HORIZONTAL})', command = lambda: self.flip(HORIZONTAL))
98+
self.cmdMenu.add_command(label = f'Flip ({VERTICAL})', command = lambda: self.flip(VERTICAL))
9499
self.cmdMenu.add_command(label = RESHAPE, command = self.reshape)
95100
self.cmdMenu.add_separator()
96101
self.cmdMenu.add_command(label = LOWER_TRIANGULAR, accelerator = shortcuts[LOWER_TRIANGULAR], command = lambda: self.triangularMatrix(LOWER))
@@ -336,7 +341,7 @@ def onResultTypeChange(self):
336341
self.generateEntries(row, 1)
337342
if entries:
338343
for i in range(1, col):
339-
setEntry(self.entries[(i, 0)], entries[i])
344+
setEntry(self.entries[i, 0], entries[i])
340345

341346
def setResultFormat(self, resultFormat):
342347
if self.resultFormat.get() == resultFormat:
@@ -385,12 +390,12 @@ def generateEntries(self, row, col):
385390
continue
386391
label = Label(self.entryFrame, width = columnLabelWidth, text = i)
387392
label.grid(row = 0, column = i)
388-
self.entryLabels[(0, i)] = label
393+
self.entryLabels[0, i] = label
389394
for i in range(row):
390395
if (i + 1, 0) not in self.entryLabels:
391396
label = Label(self.entryFrame, text = i + 1)
392397
label.grid(row = i + 1, column = 0)
393-
self.entryLabels[(i + 1, 0)] = label
398+
self.entryLabels[i + 1, 0] = label
394399
for j in range(col):
395400
if (i, j) in self.entries:
396401
continue
@@ -401,18 +406,18 @@ def generateEntries(self, row, col):
401406
bindtags = entry.bindtags()
402407
entry.bindtags((bindtags[2], bindtags[0], bindtags[1], bindtags[3]))
403408
entry.grid(row = i + 1, column = j + 1, sticky = NSEW)
404-
self.entries[(i, j)] = entry
409+
self.entries[i, j] = entry
405410
for i, j in self.entries.copy():
406411
if i >= row or j >= col:
407-
self.entries[(i, j)].grid_forget()
408-
del self.entries[(i, j)]
412+
self.entries[i, j].grid_forget()
413+
del self.entries[i, j]
409414
for i, j in self.entryLabels.copy():
410415
if i > row:
411-
self.entryLabels[(i, 0)].grid_forget()
412-
del self.entryLabels[(i, 0)]
416+
self.entryLabels[i, 0].grid_forget()
417+
del self.entryLabels[i, 0]
413418
elif j > col:
414-
self.entryLabels[(0, j)].grid_forget()
415-
del self.entryLabels[(0, j)]
419+
self.entryLabels[0, j].grid_forget()
420+
del self.entryLabels[0, j]
416421

417422
def beforeDelete(self, event):
418423
entry = self.getFocusEntry()
@@ -423,9 +428,9 @@ def beforeDelete(self, event):
423428
if r == 0 and c == 0:
424429
self.colEntry.focus()
425430
elif c == 0:
426-
self.entries[(r - 1, col - 1)].focus()
431+
self.entries[r - 1, col - 1].focus()
427432
else:
428-
self.entries[(r, c - 1)].focus()
433+
self.entries[r, c - 1].focus()
429434

430435
def onEntryChange(self, event):
431436
self.modifyState()
@@ -448,7 +453,7 @@ def moveFocus(self, event):
448453
else:
449454
# check empty
450455
if not self.entries: return
451-
fEntry = self.entries[(row - 1 if key == UP else 0, 0 if entry == self.rowEntry else col - 1)]
456+
fEntry = self.entries[row - 1 if key == UP else 0, 0 if entry == self.rowEntry else col - 1]
452457
else:
453458
info = entry.grid_info()
454459
r, c = info['row'] - 1, info['column'] - 1
@@ -458,7 +463,7 @@ def moveFocus(self, event):
458463
x, y = {UP: (-1, 0), DOWN: (1, 0), LEFT: (0, -1), RIGHT: (0, 1)}[key]
459464
r = (r + x) % row
460465
c = (c + y) % col
461-
fEntry = self.entries[(r, c)]
466+
fEntry = self.entries[r, c]
462467
fEntry.focus()
463468
if key in [UP, DOWN]:
464469
fEntry.icursor(END if isEnd else min(len(fEntry.get()), cursorIndex))
@@ -539,7 +544,7 @@ def collectEntries(self, evaluate: bool = True, nested: bool = False, withEmpty:
539544
for i in range(self.row):
540545
if nested: lst = []
541546
for j in range(self.col):
542-
text = self.entries[(i, j)].get()
547+
text = self.entries[i, j].get()
543548
if not withEmpty and not text: continue
544549
if evaluate and text: text = ezs.numEval(text)
545550
if nested: lst.append(text)
@@ -665,15 +670,15 @@ def insert(self, fromFormat):
665670
self.generateEntries(r, c)
666671
for i in range(r):
667672
for j in range(c):
668-
setEntry(self.entries[(i, j)], matrix[i][j])
673+
setEntry(self.entries[i, j], matrix[i][j])
669674
self.modifyState()
670675

671676
def appendIndex(self):
672677
isLatex = self.resultFormat.get() == LATEX
673678
for i in range(self.getRow()):
674679
for j in range(self.getCol()):
675680
text = f'{i + 1}{j + 1}'
676-
self.entries[(i, j)].insert(END, '_{%s}' % text if isLatex else text)
681+
self.entries[i, j].insert(END, '_{%s}' % text if isLatex else text)
677682

678683
def fillRC(self, title):
679684
isRow = title == FILL_ROW
@@ -721,10 +726,10 @@ def copyRC(self, title):
721726
continue
722727
if isRow:
723728
for _ in range(c):
724-
setEntry(self.entries[(j, _)], self.entries[(i, _)].get())
729+
setEntry(self.entries[j, _], self.entries[i, _].get())
725730
else:
726731
for _ in range(r):
727-
setEntry(self.entries[(_, j)], self.entries[(_, i)].get())
732+
setEntry(self.entries[_, j], self.entries[_, i].get())
728733
break
729734
fEntry.focus()
730735

@@ -771,7 +776,7 @@ def duplicateRC(self, title):
771776
entries = [[entries[i][result]] * c for i in range(r)]
772777
for i in range(r):
773778
for j in range(c):
774-
setEntry(self.entries[(i, j)], entries[i][j])
779+
setEntry(self.entries[i, j], entries[i][j])
775780
break
776781
fEntry.focus()
777782

@@ -782,7 +787,7 @@ def identityMatrix(self):
782787
if row != col:
783788
self.syncRowCol(max(row, col))
784789
for i, j in self.entries:
785-
setEntry(self.entries[(i, j)], 1 if i == j else 0)
790+
setEntry(self.entries[i, j], 1 if i == j else 0)
786791
self.modifyState()
787792

788793
def append(self, position):
@@ -818,7 +823,7 @@ def onFind(self, dialog, target, direction, findNext = True):
818823
r, c = self.getRowCol()
819824
for i in range(r):
820825
for j in range(c):
821-
text = self.entries[(i, j)].get()
826+
text = self.entries[i, j].get()
822827
for index in ez.find(text).all(target):
823828
self.findResult.append(((i, j), index, index + targetLen))
824829
if self.currentEntry and divmod(self.currentEntry[1], c) == (i, j) and self.currentEntry[2] == index:
@@ -861,7 +866,7 @@ def find(self, findType):
861866
break
862867
try:
863868
x, y = result.replace(' ', '').split(',')
864-
entry = self.entries[(int(x) - 1, int(y) - 1)]
869+
entry = self.entries[int(x) - 1, int(y) - 1]
865870
entry.focus()
866871
entry.select_range(0, END)
867872
break
@@ -969,19 +974,41 @@ def switch(self, target):
969974
self.modifyState()
970975

971976
def transpose(self):
972-
resultType = self.resultType.get()
973-
if resultType not in [MATRIX, DETERMINANT, VECTOR]:
974-
return
977+
entries = { key: entry.get() for key, entry in self.entries.items() }
978+
row, col = self.getRowCol()
979+
if row != col:
980+
if self.resultType.get() == VECTOR:
981+
self.setResultType(MATRIX)
982+
self.setRowCol(col, row)
983+
self.generateEntries(col, row)
984+
row, col = col, row
985+
for i in range(row):
986+
for j in range(col):
987+
setEntry(self.entries[i, j], entries[j, i])
988+
self.modifyState()
989+
990+
def rotate(self, direction):
991+
entries = self.collectEntries(nested = True)
992+
entries = np.rot90(entries, axes = (0, 1) if direction == COUNTER else (1, 0))
975993
row, col = self.getRowCol()
976-
entries = { key: self.entries[key].get() for key in self.entries }
977994
if row != col:
978-
if resultType == VECTOR:
995+
if self.resultType.get() == VECTOR:
979996
self.setResultType(MATRIX)
980997
self.setRowCol(col, row)
981998
self.generateEntries(col, row)
999+
row, col = col, row
1000+
for i in range(row):
1001+
for j in range(col):
1002+
setEntry(self.entries[i, j], entries[i][j])
1003+
self.modifyState()
1004+
1005+
def flip(self, direction):
1006+
entries = self.collectEntries(nested = True)
1007+
entries = np.fliplr(entries) if direction == HORIZONTAL else np.flipud(entries)
1008+
row, col = self.getRowCol()
9821009
for i in range(row):
9831010
for j in range(col):
984-
setEntry(self.entries[(j, i)], entries[(i, j)])
1011+
setEntry(self.entries[i, j], entries[i][j])
9851012
self.modifyState()
9861013

9871014
def zeroMatrix(self):
@@ -1112,7 +1139,7 @@ def sort(self, target):
11121139
vars = []
11131140
for i in range(row):
11141141
for j in range(col):
1115-
text = self.entries[(i, j)].get()
1142+
text = self.entries[i, j].get()
11161143
fText = ez.find(text)
11171144
varNumber = ez.Eval(fText.between('_{', '}'))
11181145
varType = type(varNumber)
@@ -1146,7 +1173,7 @@ def sort(self, target):
11461173
values = sorted(values)
11471174
for i in range(row):
11481175
for j in range(col):
1149-
setEntry(self.entries[(i, j)], values[i][j])
1176+
setEntry(self.entries[i, j], values[i][j])
11501177
self.modifyState()
11511178

11521179
def reverse(self, target):
@@ -1156,7 +1183,7 @@ def reverse(self, target):
11561183
if target == ALL:
11571184
for i in range(row * col // 2):
11581185
r, c = divmod(i, col)
1159-
e1, e2 = self.entries[(r, c)], self.entries[(row - r - 1, col - c - 1)]
1186+
e1, e2 = self.entries[r, c], self.entries[row - r - 1, col - c - 1]
11601187
t1, t2 = e2.get(), e1.get()
11611188
setEntry(e1, t1)
11621189
setEntry(e2, t2)
@@ -1168,7 +1195,7 @@ def reverse(self, target):
11681195
values = list(reversed(values))
11691196
for i in range(row):
11701197
for j in range(col):
1171-
setEntry(self.entries[(i, j)], values[i][j])
1198+
setEntry(self.entries[i, j], values[i][j])
11721199
self.modifyState()
11731200

11741201
def reshape(self):
@@ -1209,7 +1236,7 @@ def reshape(self):
12091236
def triangularMatrix(self, mode):
12101237
for i, j in self.entries:
12111238
if i < j if mode == LOWER else i > j:
1212-
setEntry(self.entries[(i, j)], 0)
1239+
setEntry(self.entries[i, j], 0)
12131240
self.modifyState()
12141241

12151242
def unitMatrix(self):
@@ -1227,8 +1254,8 @@ def permutationMatrix(self):
12271254
shuffle(cols)
12281255
for i in range(size):
12291256
for j in range(size):
1230-
setEntry(self.entries[(i, j)], 0)
1231-
setEntry(self.entries[(i, cols.pop())], 1)
1257+
setEntry(self.entries[i, j], 0)
1258+
setEntry(self.entries[i, cols.pop()], 1)
12321259
self.modifyState()
12331260

12341261
def unknownMatrix(self):
@@ -1262,7 +1289,7 @@ def permutationConversion(self):
12621289
for i, row in enumerate(entries):
12631290
if row.count(1) != 1 and row.count(0) != len(row) - 1:
12641291
return
1265-
setEntry(self.entries[(i, 0)], row.index(1) + isNormal)
1292+
setEntry(self.entries[i, 0], row.index(1) + isNormal)
12661293
self.setResultType(VECTOR)
12671294
else:
12681295
if any(i not in entries for i in range(isNormal, r + isNormal)):
@@ -1271,7 +1298,7 @@ def permutationConversion(self):
12711298
self.syncRowCol(r)
12721299
for i in range(r):
12731300
for j in range(r):
1274-
setEntry(self.entries[(i, j)], entries[i] == j + isNormal)
1301+
setEntry(self.entries[i, j], entries[i] == j + isNormal)
12751302
self.modifyState()
12761303

12771304
def calculateDet(self):
@@ -1339,7 +1366,7 @@ def modifyEntryWidth(self, dialog, value):
13391366
for entry in self.entries.values():
13401367
entry['width'] = value
13411368
for i in range(1, self.getCol() + 1):
1342-
self.entryLabels[(0, i)]['width'] = value
1369+
self.entryLabels[0, i]['width'] = value
13431370

13441371
def adjustWidth(self):
13451372
dialog = SliderDialog(self, 20)
@@ -1368,7 +1395,7 @@ def resumeState(self):
13681395
self.setResultType(resultType)
13691396
for i, row in enumerate(entries):
13701397
for j, entry in enumerate(row):
1371-
setEntry(self.entries[(i, j)], entry)
1398+
setEntry(self.entries[i, j], entry)
13721399
entry = self.getLastFocusEntry(c)
13731400
entry.focus()
13741401
entry.icursor(focus[2])

Diff for: Python Files/MatrixGenerator/constants.py

+4
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
ADD = 'Add'
5050
MULTIPLY = 'Multiply'
5151
TRANSPOSE = 'Transpose'
52+
CLOCKWISE = 'Clockwise'
53+
COUNTER = 'Counter'
54+
HORIZONTAL = 'Horizontal'
55+
VERTICAL = 'Vertical'
5256
RANDOM = 'Random'
5357
RANDOM_MATRIX = 'Random Matrix'
5458
SHUFFLE = 'Shuffle'

0 commit comments

Comments
 (0)