Compare commits
2 Commits
v0.1.0
...
0ed28c03fb
| 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
|
## 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
|
git clone https://git.h3cx.dev/h3cx/UniLoader.git
|
||||||
|
|
||||||
cd UniLoader
|
cd UniLoader
|
||||||
|
|
||||||
cargo build -r
|
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
|
## 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
|
mkdir ~/.config/uniloader
|
||||||
|
|
||||||
touch ~/.config/uniloader/config.toml
|
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]
|
[libraries]
|
||||||
path = "~/KiCad/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.
|
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)]
|
#[derive(Debug, Deserialize, Serialize)]
|
||||||
struct Config {
|
struct Config {
|
||||||
libraries: LibConfig,
|
libraries: LibConfig,
|
||||||
|
options: Option<OptionsConfig>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
@@ -34,6 +35,7 @@ impl Config {
|
|||||||
libraries: LibConfig {
|
libraries: LibConfig {
|
||||||
path: PathBuf::from("~/KiCad/libraries/"),
|
path: PathBuf::from("~/KiCad/libraries/"),
|
||||||
},
|
},
|
||||||
|
options: None,
|
||||||
};
|
};
|
||||||
let contents = toml::to_string_pretty(&config).map_err(|_| ConfigError::ConfigErr)?;
|
let contents = toml::to_string_pretty(&config).map_err(|_| ConfigError::ConfigErr)?;
|
||||||
fs::write(&config_path, contents).map_err(|_| ConfigError::ConfigErr)?;
|
fs::write(&config_path, contents).map_err(|_| ConfigError::ConfigErr)?;
|
||||||
@@ -47,6 +49,12 @@ struct LibConfig {
|
|||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Serialize, Clone)]
|
||||||
|
struct OptionsConfig {
|
||||||
|
symbols: Option<bool>,
|
||||||
|
footprints: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
enum SourceType {
|
enum SourceType {
|
||||||
SymacSys,
|
SymacSys,
|
||||||
UltraLibrarian,
|
UltraLibrarian,
|
||||||
@@ -311,7 +319,7 @@ fn import_symacsys(path: &Path, config: &Config) -> Result<(), ImportError> {
|
|||||||
let sym = root.join("SymacSys_Components.kicad_sym");
|
let sym = root.join("SymacSys_Components.kicad_sym");
|
||||||
let pretty = root.join("SymacSys_Footprints.pretty");
|
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)?;
|
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -365,7 +373,7 @@ fn import_ultralibrarian(path: &Path, config: &Config) -> Result<(), ImportError
|
|||||||
let sym = root.join("UltraLibrarian_Components.kicad_sym");
|
let sym = root.join("UltraLibrarian_Components.kicad_sym");
|
||||||
let pretty = root.join("UltraLibrarian_Footprints.pretty");
|
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)?;
|
fs::remove_dir_all(tmp_path).map_err(|_| ImportError::InvalidPath)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -406,7 +414,7 @@ fn import_snapmagic(path: &Path, config: &Config) -> Result<(), ImportError> {
|
|||||||
let sym = root.join("SnapMagic_components.kicad_sym");
|
let sym = root.join("SnapMagic_components.kicad_sym");
|
||||||
let pretty = root.join("SnapMagic_Footprints.pretty");
|
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)?;
|
fs::remove_dir_all(data_dir).map_err(|_| ImportError::InvalidPath)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -418,40 +426,56 @@ fn install_library(
|
|||||||
lib_root: &Path,
|
lib_root: &Path,
|
||||||
sym_file: &Path,
|
sym_file: &Path,
|
||||||
pretty_dir: &Path,
|
pretty_dir: &Path,
|
||||||
|
config: &Config,
|
||||||
) -> Result<(), ImportError> {
|
) -> 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(lib_root).map_err(|_| ImportError::InvalidPath)?;
|
||||||
fs::create_dir_all(pretty_dir).map_err(|_| ImportError::InvalidPath)?;
|
fs::create_dir_all(pretty_dir).map_err(|_| ImportError::InvalidPath)?;
|
||||||
|
|
||||||
// Load or create symbol library
|
if symbols {
|
||||||
let mut current_lib = if sym_file.exists() {
|
// Load or create symbol library
|
||||||
let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?;
|
let mut current_lib = if sym_file.exists() {
|
||||||
SymbolLibrary::from_str(&contents)
|
let contents = fs::read_to_string(sym_file).map_err(|_| ImportError::InvalidPath)?;
|
||||||
} else {
|
SymbolLibrary::from_str(&contents)
|
||||||
SymbolLibrary::new()
|
} else {
|
||||||
};
|
SymbolLibrary::new()
|
||||||
|
};
|
||||||
|
|
||||||
// Install symbols
|
// Install symbols
|
||||||
for sym_path in sym_files {
|
for sym_path in sym_files {
|
||||||
let sym_str = fs::read_to_string(&sym_path).map_err(|_| ImportError::InvalidPath)?;
|
let sym_str = fs::read_to_string(&sym_path).map_err(|_| ImportError::InvalidPath)?;
|
||||||
let new_lib = SymbolLibrary::from_str(&sym_str);
|
let new_lib = SymbolLibrary::from_str(&sym_str);
|
||||||
|
|
||||||
for symbol in new_lib.symbols {
|
for symbol in new_lib.symbols {
|
||||||
if !current_lib.symbols.iter().any(|s| s.name == symbol.name) {
|
if !current_lib.symbols.iter().any(|s| s.name == symbol.name) {
|
||||||
current_lib.symbols.push(symbol);
|
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() {
|
if footprints {
|
||||||
let output = current_lib.write();
|
// Install footprints
|
||||||
fs::write(sym_file, output).map_err(|_| ImportError::InvalidPath)?;
|
for mod_path in mod_files {
|
||||||
}
|
let filename = mod_path.file_name().ok_or(ImportError::InvalidPath)?;
|
||||||
|
let target = pretty_dir.join(filename);
|
||||||
// Install footprints
|
fs::copy(mod_path, target).map_err(|_| ImportError::InvalidPath)?;
|
||||||
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(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user