File size: 5,304 Bytes
a47059b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import os
from collections import defaultdict

def count_part_frequencies(ldr_content):
    """
    精确统计.ldr文件中零件使用频率(基于1开头的行)
    
    参数:
        ldr_content: .ldr文件的内容字符串
    
    返回:
        defaultdict: 零件文件名 -> 出现次数
    """
    freq = defaultdict(int)
    for line in ldr_content.splitlines():
        line = line.strip()
        if line.startswith('1 '):
            parts = line.split()
            if len(parts) >= 15:  # 确保是完整的零件定义行
                part_filename = parts[-1].lower()  # 统一小写处理
                freq[part_filename] += 1
    return freq

def build_frequency_index(folder_path):
    """
    为文件夹中的所有.ldr文件建立频率索引
    
    参数:
        folder_path: 文件夹路径
    
    返回:
        dict: {文件名: 频率字典}
    """
    freq_index = {}
    for filename in os.listdir(folder_path):
        if filename.lower().endswith('.ldr'):
            file_path = os.path.join(folder_path, filename)
            with open(file_path, 'r') as f:
                freq_index[filename] = count_part_frequencies(f.read())
    return freq_index

def compare_folders(folder1, folder2):
    """
    比较两个文件夹中的.ldr文件,找出没有匹配的文件
    
    参数:
        folder1: 第一个文件夹路径
        folder2: 第二个文件夹路径
    """
    # 为两个文件夹建立频率索引
    freq_index1 = build_frequency_index(folder1)
    freq_index2 = build_frequency_index(folder2)
    
    # 转换第二个文件夹的索引为频率字典到文件名的映射
    freq_to_files2 = defaultdict(list)
    for filename, freq in freq_index2.items():
        freq_key = frozenset(freq.items())  # 将字典转换为可哈希的frozenset
        freq_to_files2[freq_key].append(filename)
    
    # 检查folder1中的每个文件是否在folder2中有匹配
    unmatched_files = []
    for filename1, freq1 in freq_index1.items():
        freq_key = frozenset(freq1.items())
        if freq_key not in freq_to_files2:
            unmatched_files.append(filename1)
    
    # 输出结果
    if unmatched_files:
        print("以下文件在目标文件夹中没有找到匹配项:")
        for filename in unmatched_files:
            print(f" - {filename}")
    else:
        print("所有文件都在目标文件夹中找到了匹配项")

def compare_two_ldr_files(file1, file2):
    """
    详细比较两个.ldr文件的零件使用差异
    
    参数:
        file1: 第一个.ldr文件路径
        file2: 第二个.ldr文件路径
    
    返回:
        dict: 差异报告字典
    """
    with open(file1, 'r') as f1, open(file2, 'r') as f2:
        freq1 = count_part_frequencies(f1.read())
        freq2 = count_part_frequencies(f2.read())
    
    # 获取所有零件类别的并集
    all_parts = set(freq1.keys()).union(set(freq2.keys()))
    
    differences = {
        'only_in_file1': {},
        'only_in_file2': {},
        'count_differences': {}
    }
    
    for part in sorted(all_parts):
        count1 = freq1.get(part, 0)
        count2 = freq2.get(part, 0)
        
        if count1 == 0 and count2 > 0:
            differences['only_in_file2'][part] = count2
        elif count1 > 0 and count2 == 0:
            differences['only_in_file1'][part] = count1
        elif count1 != count2:
            differences['count_differences'][part] = (count1, count2)
    
    return differences

def print_differences(differences, file1_name, file2_name):
    """
    打印两个文件的比较结果
    
    参数:
        differences: compare_two_ldr_files()的返回结果
        file1_name: 第一个文件名(用于显示)
        file2_name: 第二个文件名(用于显示)
    """
    print(f"\n详细比较结果 ({file1_name} vs {file2_name}):")
    
    if differences['only_in_file1']:
        print("\n只在第一个文件中出现的零件:")
        for part, count in differences['only_in_file1'].items():
            print(f" - {part}: {count}次")
    
    if differences['only_in_file2']:
        print("\n只在第二个文件中出现的零件:")
        for part, count in differences['only_in_file2'].items():
            print(f" - {part}: {count}次")
    
    if differences['count_differences']:
        print("\n出现次数不同的零件:")
        for part, (count1, count2) in differences['count_differences'].items():
            print(f" - {part}: {file1_name}={count1}次, {file2_name}={count2}次")
    
    if not any(differences.values()):
        print("两个文件使用的零件完全相同")

# 使用示例
folder1 = '/public/home/wangshuo/gap/assembly/cubedit/outputs/sample/'
folder2 = '/public/home/wangshuo/gap/assembly/data/car_1k/subset_self/ldr_l30_rotrans_expand_wom'

# 比较两个文件夹
#compare_folders(folder1, folder2)

# 比较两个具体文件
file1 = '/public/home/wangshuo/gap/assembly/cubedit/outputs/sample/test_0_drp_101_r512_uncond.ldr'
file2 = '/public/home/wangshuo/gap/assembly/data/car_1k/subset_self/ldr_l30_rotrans_expand_wom/modified_car_121_rot.ldr'
diff_result = compare_two_ldr_files(file1, file2)
print_differences(diff_result, os.path.basename(file1), os.path.basename(file2))