Spaces:
Paused
Paused
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)) |