framework/freecad_workbench/freecad/robossembler/solve_optimizer.py
2024-12-01 22:14:19 +03:00

136 lines
No EOL
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'''
Файл, содержащий скрипт для обработки и упрощения матрицы смежности. Запускается через команду в основном меню верстака freecad
'''
import json
import FreeCAD as App
from geometric_feasibility_predicate.main import main as asm_analysis
from constraints_operator import collect_assembly_settings
# === Для работы с json-файлами. Работает. ===
def simplify_adjacency_matrix_json(assembly_file, adjacency_file, output_file):
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
def save_json(file_path, data):
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
assembly_settings = load_json('/assembly_settings.json')
adjacency_matrix = load_json('/adjacency_matrix.json')
fasteners = set()
for item in assembly_settings:
if item.get("Type") == "fastener_set":
fasteners.add(item["Parent"])
fasteners.add(item["Child"])
simplified_matrix = {
"allParts": [],
"matrix": {}
}
for part in adjacency_matrix["allParts"]:
if part not in fasteners:
simplified_matrix["allParts"].append(part)
neighbors = [
neighbor for neighbor in adjacency_matrix["matrix"].get(part, [])
if neighbor not in fasteners
]
if neighbors or part not in fasteners:
simplified_matrix["matrix"][part] = neighbors
save_json(output_file, simplified_matrix)
# simplify_adjacency_matrix('assembly_settings.json', 'adjacency_matrix.json', 'simplified_adjacency_matrix.json')
def restore_full_sequence_json(assembly_file, sequence_file, output_file):
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
def save_json(file_path, data):
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
assembly_settings = load_json(assembly_file)
sequence = load_json(sequence_file)
full_sequence = []
sequence_set = set(sequence)
for item in sequence:
full_sequence.append(item)
for setting in assembly_settings:
if setting.get("Type") == "fastener_set":
parent = setting["Parent"]
child = setting["Child"]
if parent in sequence_set and child in sequence_set:
full_sequence.append(setting["Fasteners"])
save_json(output_file, full_sequence)
# restore_full_sequence('assembly_settings.json', 'sequence.json', 'full_sequence.json')
# ==== Для работы с внутренними переменными
def simplify_adjacency_matrix(assembly_settings, adjacency_matrix):
fasteners = set()
for item in assembly_settings:
if item.get("Type") == "fastener_set":
fasteners.add(item["Parent"])
fasteners.add(item["Child"])
simplified_matrix = {
"allParts": [],
"matrix": {}
}
for part in adjacency_matrix["allParts"]:
if part not in fasteners:
simplified_matrix["allParts"].append(part)
neighbors = [
neighbor for neighbor in adjacency_matrix["matrix"].get(part, [])
if neighbor not in fasteners
]
if neighbors or part not in fasteners:
simplified_matrix["matrix"][part] = neighbors
return simplified_matrix
def restore_full_sequence(assembly_settings, sequence):
full_sequence = []
sequence_set = set(sequence)
for item in sequence:
full_sequence.append(item)
for setting in assembly_settings:
if setting.get("Type") == "fastener_set":
parent = setting["Parent"]
child = setting["Child"]
if parent in sequence_set and child in sequence_set:
full_sequence.append(setting["Fasteners"])
return full_sequence
def main():
if App.ActiveDocument:
intersection_geometry, sequences, topologyMatrix = asm_analysis()
print(sequences)
assembly_settings = collect_assembly_settings()
simplified_matrix = simplify_adjacency_matrix(assembly_settings, topologyMatrix)
else:
print('Ошибка. Нет активного документа!')
main()