logical_layers/backend/storage.py

134 lines
4.3 KiB
Python

# backend/storage.py
import os
import json
import time
import datetime
import pcbnew
class StorageManager:
def __init__(self):
self.project_dir = ""
self.session_dir = ""
self.layers_dir = ""
self.master_file = ""
def _get_board_path(self):
try:
board = pcbnew.GetBoard()
return board.GetFileName()
except:
return ""
def setup_paths(self):
board_path = self._get_board_path()
if not board_path: return False
self.project_dir = os.path.dirname(board_path)
filename = os.path.basename(board_path)
schematic_name = os.path.splitext(filename)[0]
try:
mtime = os.path.getmtime(board_path)
ts_str = str(int(mtime))
except:
ts_str = str(int(time.time()))
date_str = datetime.datetime.fromtimestamp(mtime).strftime("%b_%d")
session_name = f"{schematic_name}_{ts_str}_{date_str}"
self.session_dir = os.path.join(self.project_dir, session_name)
self.layers_dir = os.path.join(self.session_dir, "logical_layers")
self.master_file = os.path.join(self.layers_dir, "$Master$.json")
if not os.path.exists(self.layers_dir):
try:
os.makedirs(self.layers_dir)
except OSError as e:
print(f"Storage: Failed to create dirs: {e}")
return False
return True
def save_item(self, item_data, uuid=None):
if not self.session_dir: self.setup_paths()
cls = item_data.get('class', 'Item')
ref = item_data.get('ref', '')
net = item_data.get('net', '')
name_part = ref if ref else (net if net else cls)
name_part = "".join(c for c in name_part if c.isalnum() or c in ('_', '-'))
suffix = uuid[:8] if uuid else "unknown"
filename = f"{name_part}_{suffix}.json"
filepath = os.path.join(self.session_dir, filename)
try:
with open(filepath, 'w') as f:
json.dump(item_data, f, indent=2)
return filename
except Exception as e:
print(f"Storage: Error saving item {filename}: {e}")
return None
def save_layer(self, layer_name, layer_data):
if not self.session_dir: self.setup_paths()
filename = f"{layer_name}.json"
filepath = os.path.join(self.layers_dir, filename)
try:
with open(filepath, 'w') as f:
json.dump(layer_data, f, indent=2)
return filename
except Exception as e:
print(f"Storage: Error saving layer {layer_name}: {e}")
return None
def update_master(self, layers_list):
if not self.session_dir: self.setup_paths()
master_data = {
"updated": time.time(),
"layers": []
}
for l in layers_list:
master_data["layers"].append({
"name": l.name,
"visible": l.visible,
"item_count": len(l.on_board_items) if l.visible else len(l.stored_items),
"file": f"{l.name}.json"
})
try:
with open(self.master_file, 'w') as f:
json.dump(master_data, f, indent=2)
except Exception as e:
print(f"Storage: Error updating Master: {e}")
def load_master(self):
if not self.session_dir: self.setup_paths()
if os.path.exists(self.master_file):
try:
with open(self.master_file, 'r') as f:
return json.load(f)
except: pass
return None
def load_layer(self, layer_name):
if not self.session_dir: self.setup_paths()
filepath = os.path.join(self.layers_dir, f"{layer_name}.json")
if os.path.exists(filepath):
with open(filepath, 'r') as f:
return json.load(f)
return None
def load_item(self, filename):
if not self.session_dir: self.setup_paths()
filepath = os.path.join(self.session_dir, filename)
if os.path.exists(filepath):
with open(filepath, 'r') as f:
return json.load(f)
return None