e4c7119c51
🎉 Major v2.0 rebuild kickoff - Week 1 accomplished! ## Highlights ### Cross-Platform Support 🌍 - ✅ Linux primary platform (Ubuntu/Debian tested) - ✅ Windows fully supported - ✅ macOS experimental support - ✅ Platform-agnostic path handling (XDG spec) - ✅ Auto-detection of KiCAD installation ### Infrastructure 🏗️ - ✅ GitHub Actions CI/CD pipeline - ✅ Pytest framework with 20+ tests - ✅ Pre-commit hooks (Black, MyPy, ESLint) - ✅ Automated Linux installation script - ✅ Enhanced npm scripts ### IPC API Migration Prep 🚀 - ✅ Comprehensive migration plan (30 pages) - ✅ Backend abstraction layer (800+ lines) - ✅ Factory pattern with auto-detection - ✅ SWIG backward compatibility wrapper - ✅ IPC backend skeleton ready ### Documentation 📚 - ✅ Updated README (Linux installation) - ✅ CONTRIBUTING.md guide - ✅ Linux compatibility audit - ✅ IPC API migration plan - ✅ Session summaries - ✅ Platform-specific config templates ## Files Changed - 27 files created - ~3,000 lines of code/docs - 8 comprehensive documentation pages - 20+ unit tests - 5 abstraction layer modules ## Next Steps - Week 2: IPC API migration (project.py → component.py → routing.py) - Migrate from deprecated SWIG to official IPC API - JLCPCB/Digikey integration prep 🤖 Generated with Claude Code https://claude.com/claude-code Co-Authored-By: Claude <noreply@anthropic.com>
142 lines
6.7 KiB
Python
142 lines
6.7 KiB
Python
from skip import Schematic
|
|
# Symbol class might not be directly importable in the current version
|
|
import os
|
|
import glob
|
|
|
|
class LibraryManager:
|
|
"""Manage symbol libraries"""
|
|
|
|
@staticmethod
|
|
def list_available_libraries(search_paths=None):
|
|
"""List all available symbol libraries"""
|
|
if search_paths is None:
|
|
# Default library paths based on common KiCAD installations
|
|
# This would need to be configured for the specific environment
|
|
search_paths = [
|
|
"C:/Program Files/KiCad/*/share/kicad/symbols/*.kicad_sym", # Windows path pattern
|
|
"/usr/share/kicad/symbols/*.kicad_sym", # Linux path pattern
|
|
"/Applications/KiCad/KiCad.app/Contents/SharedSupport/symbols/*.kicad_sym", # macOS path pattern
|
|
os.path.expanduser("~/Documents/KiCad/*/symbols/*.kicad_sym") # User libraries pattern
|
|
]
|
|
|
|
libraries = []
|
|
for path_pattern in search_paths:
|
|
try:
|
|
# Use glob to find all matching files
|
|
matching_libs = glob.glob(path_pattern, recursive=True)
|
|
libraries.extend(matching_libs)
|
|
except Exception as e:
|
|
print(f"Error searching for libraries at {path_pattern}: {e}")
|
|
|
|
# Extract library names from paths
|
|
library_names = [os.path.splitext(os.path.basename(lib))[0] for lib in libraries]
|
|
print(f"Found {len(library_names)} libraries: {', '.join(library_names[:10])}{'...' if len(library_names) > 10 else ''}")
|
|
|
|
# Return both full paths and library names
|
|
return {"paths": libraries, "names": library_names}
|
|
|
|
@staticmethod
|
|
def list_library_symbols(library_path):
|
|
"""List all symbols in a library"""
|
|
try:
|
|
# kicad-skip doesn't provide a direct way to simply list symbols in a library
|
|
# without loading each one. We might need to implement this using KiCAD's Python API
|
|
# directly, or by using a different approach.
|
|
# For now, this is a placeholder implementation.
|
|
|
|
# A potential approach would be to load the library file using KiCAD's Python API
|
|
# or by parsing the library file format.
|
|
# KiCAD symbol libraries are .kicad_sym files which are S-expression format
|
|
print(f"Attempted to list symbols in library {library_path}. This requires advanced implementation.")
|
|
return []
|
|
except Exception as e:
|
|
print(f"Error listing symbols in library {library_path}: {e}")
|
|
return []
|
|
|
|
@staticmethod
|
|
def get_symbol_details(library_path, symbol_name):
|
|
"""Get detailed information about a symbol"""
|
|
try:
|
|
# Similar to list_library_symbols, this might require a more direct approach
|
|
# using KiCAD's Python API or by parsing the symbol library.
|
|
print(f"Attempted to get details for symbol {symbol_name} in library {library_path}. This requires advanced implementation.")
|
|
return {}
|
|
except Exception as e:
|
|
print(f"Error getting symbol details for {symbol_name} in {library_path}: {e}")
|
|
return {}
|
|
|
|
@staticmethod
|
|
def search_symbols(query, search_paths=None):
|
|
"""Search for symbols matching criteria"""
|
|
try:
|
|
# This would typically involve:
|
|
# 1. Getting a list of all libraries using list_available_libraries
|
|
# 2. For each library, getting a list of all symbols
|
|
# 3. Filtering symbols based on the query
|
|
|
|
# For now, this is a placeholder implementation
|
|
libraries = LibraryManager.list_available_libraries(search_paths)
|
|
|
|
results = []
|
|
print(f"Searched for symbols matching '{query}'. This requires advanced implementation.")
|
|
return results
|
|
except Exception as e:
|
|
print(f"Error searching for symbols matching '{query}': {e}")
|
|
return []
|
|
|
|
@staticmethod
|
|
def get_default_symbol_for_component_type(component_type, search_paths=None):
|
|
"""Get a recommended default symbol for a given component type"""
|
|
# This method provides a simplified way to get a symbol for common component types
|
|
# It's useful when the user doesn't specify a particular library/symbol
|
|
|
|
# Define common mappings from component type to library/symbol
|
|
common_mappings = {
|
|
"resistor": {"library": "Device", "symbol": "R"},
|
|
"capacitor": {"library": "Device", "symbol": "C"},
|
|
"inductor": {"library": "Device", "symbol": "L"},
|
|
"diode": {"library": "Device", "symbol": "D"},
|
|
"led": {"library": "Device", "symbol": "LED"},
|
|
"transistor_npn": {"library": "Device", "symbol": "Q_NPN_BCE"},
|
|
"transistor_pnp": {"library": "Device", "symbol": "Q_PNP_BCE"},
|
|
"opamp": {"library": "Amplifier_Operational", "symbol": "OpAmp_Dual_Generic"},
|
|
"microcontroller": {"library": "MCU_Module", "symbol": "Arduino_UNO_R3"},
|
|
# Add more common components as needed
|
|
}
|
|
|
|
# Normalize input to lowercase
|
|
component_type_lower = component_type.lower()
|
|
|
|
# Try direct match first
|
|
if component_type_lower in common_mappings:
|
|
return common_mappings[component_type_lower]
|
|
|
|
# Try partial matches
|
|
for key, value in common_mappings.items():
|
|
if component_type_lower in key or key in component_type_lower:
|
|
return value
|
|
|
|
# Default fallback
|
|
return {"library": "Device", "symbol": "R"}
|
|
|
|
if __name__ == '__main__':
|
|
# Example Usage (for testing)
|
|
# List available libraries
|
|
libraries = LibraryManager.list_available_libraries()
|
|
if libraries["paths"]:
|
|
first_lib = libraries["paths"][0]
|
|
lib_name = libraries["names"][0]
|
|
print(f"Testing with first library: {lib_name} ({first_lib})")
|
|
|
|
# List symbols in the first library
|
|
symbols = LibraryManager.list_library_symbols(first_lib)
|
|
# This will report that it requires advanced implementation
|
|
|
|
# Get default symbol for a component type
|
|
resistor_sym = LibraryManager.get_default_symbol_for_component_type("resistor")
|
|
print(f"Default symbol for resistor: {resistor_sym['library']}/{resistor_sym['symbol']}")
|
|
|
|
# Try a partial match
|
|
cap_sym = LibraryManager.get_default_symbol_for_component_type("cap")
|
|
print(f"Default symbol for 'cap': {cap_sym['library']}/{cap_sym['symbol']}")
|