2023-02-03 00:34:13 +01:00
#!/usr/bin/env ruby
# encoding: utf-8
# ruby: 3.0.0
= begin
2023-02-03 00:38:54 +01:00
KiCAD can have a KiCad database library
2023-02-03 00:34:13 +01:00
https : / / docs . kicad . org / master / en / eeschema / eeschema . html #database_libraries
2023-02-03 00:38:54 +01:00
this script creates views from the partdb table so to create a database for KiCAD
if wil also output the KiCad database library file
2023-02-03 00:34:13 +01:00
= end
require 'mysql2'
require 'json'
CREDENTIALS = " credentials.json "
raise " database information #{ CREDENTIALS } do not exist " unless File . file? CREDENTIALS
credentials = { }
JSON . parse ( IO . read ( CREDENTIALS ) ) . each { | key , value | credentials [ key . to_sym ] = value }
Mysql2 :: Client . default_query_options . merge! ( :as = > :hash )
db = Mysql2 :: Client . new ( credentials )
puts " create part to model views "
db . query ( " CREATE OR REPLACE VIEW part_kicad_symbol AS \
SELECT properties . part AS part , properties . value AS kicad_symbol FROM properties JOIN property ON property . id = properties . property WHERE property . name = 'kicad_symbol' " )
db . query ( " CREATE OR REPLACE VIEW part_kicad_footprint AS \
SELECT properties . part AS part , properties . value AS kicad_footprint FROM properties JOIN property ON property . id = properties . property WHERE property . name = 'kicad_footprint' " )
db . query ( " CREATE OR REPLACE VIEW part_qeda AS \
SELECT v1 . part AS part , v1 . value AS qeda_part , v2 . value AS qeda_variant FROM properties AS v1 LEFT JOIN property AS p1 ON p1 . id = v1 . property LEFT JOIN properties AS v2 ON v2 . part = v1 . part LEFT JOIN property AS p2 ON p2 . id = v2 . property WHERE p1 . name = 'qeda_part' AND p2 . name = 'qeda_variant' " )
puts " create part category tables "
kicad_dbl = { } # kicad database library file
kicad_dbl [ " meta " ] = { version : 0 }
kicad_dbl [ " name " ] = " CuVoodoo Database Library "
kicad_dbl [ " description " ] = " database of all my parts "
# username/UID and password should be configured in DSN so we don't lead it when we share the resulting file
kicad_dbl [ " source " ] = { type : " odbc " , dsn : " partdb " , timeout_seconds : 3 }
kicad_dbl [ " libraries " ] = [ ]
categories = db . query ( " SELECT properties.value AS category FROM properties LEFT JOIN property ON property.id = properties.property WHERE property.name = 'category' " ) . to_a . collect { | row | row [ 'category' ] }
categories . uniq!
categories . each do | category |
puts category
table = " kicad_lib_ " + category . gsub ( " " , " _ " ) . gsub ( " - " , " _ " ) . gsub ( " / " , " _ " ) . downcase
view = " CREATE OR REPLACE VIEW #{ table } AS \
SELECT part . id , part . name , part . description , \
COALESCE ( symbol1 . kicad_symbol , symbol2 . kicad_symbol ) AS kicad_symbol , \
COALESCE ( footprint1 . kicad_footprint , footprint2 . kicad_footprint ) AS kicad_footprint , \
COALESCE ( qeda1 . qeda_part , qeda2 . qeda_part ) AS qeda_part , \
COALESCE ( qeda1 . qeda_variant , qeda2 . qeda_variant ) AS qeda_variant \
FROM part \
LEFT JOIN part AS parent ON parent . id = part . family \
LEFT JOIN part_kicad_symbol AS symbol1 ON symbol1 . part = part . id \
LEFT JOIN part_kicad_symbol AS symbol2 ON symbol2 . part = parent . id \
LEFT JOIN part_kicad_footprint AS footprint1 ON footprint1 . part = part . id \
LEFT JOIN part_kicad_footprint AS footprint2 ON footprint2 . part = parent . id \
LEFT JOIN part_qeda AS qeda1 ON qeda1 . part = part . id \
LEFT JOIN part_qeda AS qeda2 ON qeda2 . part = parent . id \
WHERE part . id IN ( SELECT part FROM properties LEFT JOIN property ON property . id = properties . property WHERE property . name = 'category' AND properties . value = '#{category}' ) \
OR parent . id IN ( SELECT part FROM properties LEFT JOIN property ON property . id = properties . property WHERE property . name = 'category' AND properties . value = '#{category}' ) "
db . query ( view )
library = { name : category , table : table , key : " name " , symbols : " kicad_symbol " , footprints : " kicad_footprint " }
library [ :properties ] = { description : " description " }
library [ :fields ] = [ ]
library [ :fields ] << { name : " QEDA part " , column : " qeda_part " , visible_on_add : false , visible_in_chooser : true , show_name : false , inherit_properties : true }
library [ :fields ] << { name : " QEDA variant " , column : " qeda_variant " , visible_on_add : false , visible_in_chooser : true , show_name : false , inherit_properties : true }
kicad_dbl [ " libraries " ] << library
end
File . open ( " partdb.kicad_dbl " , " w " ) do | file |
file . write kicad_dbl . to_json
end