Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ed28c03fb | |||
| c5f35efc9a |
14
README.md
14
README.md
@@ -4,34 +4,28 @@ A simple daemon that automatically imports any libraries into KiCad. It currentl
|
||||
|
||||
## Installation
|
||||
|
||||
An automated install script is planned but currently the repo needs to be cloned, built and installed manually
|
||||
An automated install script is planned but currently the repo needs to be cloned, built and installed manually.
|
||||
```
|
||||
|
||||
git clone https://git.h3cx.dev/h3cx/UniLoader.git
|
||||
|
||||
cd UniLoader
|
||||
|
||||
cargo build -r
|
||||
|
||||
```
|
||||
You will then find the binary under `target/release` you can run it manually or create a systemd service to automatically run it at boot
|
||||
You will then find the binary under `target/release` you can run it manually or create a systemd service to automatically run it at boot.
|
||||
|
||||
## Usage
|
||||
|
||||
To get started you will need to set up your config, to do so create a config file
|
||||
To get started you will need to set up your config, to do so create a config file. A full config file can be found in the config folder of this repo.
|
||||
```
|
||||
|
||||
mkdir ~/.config/uniloader
|
||||
|
||||
touch ~/.config/uniloader/config.toml
|
||||
|
||||
```
|
||||
Then use your favorite text editor to open this config and paste in the minimal config
|
||||
Then use your favorite text editor to open this config and paste in the minimal config.
|
||||
```
|
||||
|
||||
[libraries]
|
||||
path = "~/KiCad/libraries/"
|
||||
|
||||
```
|
||||
Now that you have set this up, the application should be ready to go, just head over to your favorite library website and download any component.
|
||||
|
||||
|
||||
8
config/config_full.toml
Normal file
8
config/config_full.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[libraries]
|
||||
path = "/home/hector/KiCad/libraries/"
|
||||
|
||||
[options]
|
||||
# Selectively enable and disable the importing of footprints and symbols
|
||||
# symbols=true
|
||||
# footprints=false
|
||||
|
||||
78
src/main.rs
78
src/main.rs
@@ -16,6 +16,7 @@ use zip::ZipArchive;
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
struct Config {
|
||||
libraries: LibConfig,
|
||||
options: Option<OptionsConfig>,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
@@ -34,6 +35,7 @@ impl Config {
|
||||
libraries: LibConfig {
|
||||
path: PathBuf::from("~/KiCad/libraries/"),
|
||||
},
|
||||
options: None,
|
||||
};
|
||||
let contents = toml::to_string_pretty(&config).map_err(|_| ConfigError::ConfigErr)?;
|
||||
fs::write(&config_path, contents).map_err(|_| ConfigError::ConfigErr)?;
|
||||
@@ -47,6 +49,12 @@ struct LibConfig {
|
||||
path: PathBuf,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize, Clone)]
|
||||
struct OptionsConfig {
|
||||
symbols: Option<bool>,
|
||||
footprints: Option<bool>,
|
||||
}
|
||||
|
||||
enum SourceType {
|
||||
SymacSys,
|
||||
UltraLibrarian,
|
||||
@@ -311,7 +319,7 @@ fn import_symacsys(path: &Path, config: &Config) -> Result<(), ImportError> {
|
||||
let sym = root.join("SymacSys_Components.kicad_sym");
|
||||
let pretty = root.join("SymacSys_Footprints.pretty");
|
||||
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty)?;
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
|
||||
|
||||
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
|
||||
Ok(())
|
||||
@@ -365,7 +373,7 @@ fn import_ultralibrarian(path: &Path, config: &Config) -> Result<(), ImportError
|
||||
let sym = root.join("UltraLibrarian_Components.kicad_sym");
|
||||
let pretty = root.join("UltraLibrarian_Footprints.pretty");
|
||||
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty)?;
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
|
||||
|
||||
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
|
||||
Ok(())
|
||||
@@ -406,7 +414,7 @@ fn import_snapmagic(path: &Path, config: &Config) -> Result<(), ImportError> {
|
||||
let sym = root.join("SnapMagic_components.kicad_sym");
|
||||
let pretty = root.join("SnapMagic_Footprints.pretty");
|
||||
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty)?;
|
||||
install_library(sym_files, mod_files, &root, &sym, &pretty, config)?;
|
||||
|
||||
fs::remove_dir_all(data_dir).map_err(|_| ImportError::InvalidPath)?;
|
||||
Ok(())
|
||||
@@ -418,40 +426,56 @@ fn install_library(
|
||||
lib_root: &Path,
|
||||
sym_file: &Path,
|
||||
pretty_dir: &Path,
|
||||
config: &Config,
|
||||
) -> Result<(), ImportError> {
|
||||
let symbols = config
|
||||
.options
|
||||
.as_ref()
|
||||
.and_then(|o| o.symbols)
|
||||
.unwrap_or(true);
|
||||
let footprints = config
|
||||
.options
|
||||
.as_ref()
|
||||
.and_then(|o| o.footprints)
|
||||
.unwrap_or(true);
|
||||
|
||||
fs::create_dir_all(lib_root).map_err(|_| ImportError::InvalidPath)?;
|
||||
fs::create_dir_all(pretty_dir).map_err(|_| ImportError::InvalidPath)?;
|
||||
|
||||
// Load or create symbol library
|
||||
let mut current_lib = if sym_file.exists() {
|
||||
let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?;
|
||||
SymbolLibrary::from_str(&contents)
|
||||
} else {
|
||||
SymbolLibrary::new()
|
||||
};
|
||||
if symbols {
|
||||
// Load or create symbol library
|
||||
let mut current_lib = if sym_file.exists() {
|
||||
let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?;
|
||||
SymbolLibrary::from_str(&contents)
|
||||
} else {
|
||||
SymbolLibrary::new()
|
||||
};
|
||||
|
||||
// Install symbols
|
||||
for sym_path in sym_files {
|
||||
let sym_str = fs::read_to_string(&sym_path).map_err(|_| ImportError::InvalidPath)?;
|
||||
let new_lib = SymbolLibrary::from_str(&sym_str);
|
||||
// Install symbols
|
||||
for sym_path in sym_files {
|
||||
let sym_str = fs::read_to_string(&sym_path).map_err(|_| ImportError::InvalidPath)?;
|
||||
let new_lib = SymbolLibrary::from_str(&sym_str);
|
||||
|
||||
for symbol in new_lib.symbols {
|
||||
if !current_lib.symbols.iter().any(|s| s.name == symbol.name) {
|
||||
current_lib.symbols.push(symbol);
|
||||
for symbol in new_lib.symbols {
|
||||
if !current_lib.symbols.iter().any(|s| s.name == symbol.name) {
|
||||
current_lib.symbols.push(symbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !current_lib.symbols.is_empty() {
|
||||
let output = current_lib.write();
|
||||
fs::write(sym_file, output).map_err(|_| ImportError::InvalidPath)?;
|
||||
}
|
||||
}
|
||||
|
||||
if !current_lib.symbols.is_empty() {
|
||||
let output = current_lib.write();
|
||||
fs::write(sym_file, output).map_err(|_| ImportError::InvalidPath)?;
|
||||
}
|
||||
|
||||
// Install footprints
|
||||
for mod_path in mod_files {
|
||||
let filename = mod_path.file_name().ok_or(ImportError::InvalidPath)?;
|
||||
let target = pretty_dir.join(filename);
|
||||
fs::copy(mod_path, target).map_err(|_| ImportError::InvalidPath)?;
|
||||
if footprints {
|
||||
// Install footprints
|
||||
for mod_path in mod_files {
|
||||
let filename = mod_path.file_name().ok_or(ImportError::InvalidPath)?;
|
||||
let target = pretty_dir.join(filename);
|
||||
fs::copy(mod_path, target).map_err(|_| ImportError::InvalidPath)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user