Coverage for paintmaskanimator/cell_numbering.py: 87%
21 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-02 04:50 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-02 04:50 +0000
1"""セル番号(絵番号)の正規化の計算。
3番号は 1 から始まる整数の連番だけを使う(docs/design-principles.md)。
4ここではデータを変えずに、正規化したときの対応表だけを求める。
5"""
8def normalization_mapping(frames, archive_keys, layer_index):
9 """正規化したときの {旧番号: 新番号} を返す。
11 シートに登場する順に 1, 2, 3… を振り、シートで使っていない番号
12 (連番だけの番号や削除済みの番号)はその後ろへ番号順に並べる。
13 ``archive_keys`` は ``(layer_index, number)`` の並び(削除済みの絵)。
14 """
15 if not frames: 15 ↛ 16line 15 didn't jump to line 16 because the condition on line 15 was never true
16 return {}
17 target = int(layer_index)
18 sheet_numbers = []
19 all_numbers = set()
20 for frame in frames:
21 if not (0 <= target < len(frame.layers)): 21 ↛ 22line 21 didn't jump to line 22 because the condition on line 21 was never true
22 continue
23 layer = frame.layers[target]
24 number = layer.sequence_number
25 if number is None:
26 continue
27 all_numbers.add(int(number))
28 if (
29 layer.has_content
30 and not layer.sequence_only
31 and int(number) not in sheet_numbers
32 ):
33 sheet_numbers.append(int(number))
34 all_numbers.update(
35 int(number)
36 for archived_layer, number in archive_keys
37 if int(archived_layer) == target
38 )
39 ordered = sheet_numbers + sorted(all_numbers - set(sheet_numbers))
40 return {
41 old_number: new_number
42 for new_number, old_number in enumerate(ordered, 1)
43 }
46def changed_count(mapping):
47 """正規化で番号が変わる絵の数。"""
48 return sum(1 for old, new in mapping.items() if int(old) != int(new))