С появлением систем контроля версий, их начали применять для всего подряд. Действительно система контроля версий позволяет зафиксировать некие состояния системы и потом возвращаться к ним. Это набор минимум.

Благодаря тому, что kicad хранит свои данные в текстовых файлах, а не в бинарниках, это позволяет использовать git и прочие системы контроля версий для ведения проектов.

Под катом вас ждет статья о том как сделать работу с git чуть удобней при проектировании в kicad.

kicad_diff_work.png

В свой время небольшая фирма Qi-Hardware разрабатывая открытую электронику в свободном программном обеспечении создала для себя набор вспомогательных инструментов. Среди них была утилита schhist которая строила графическую историю изменений.

kicad_avt_schhist.png

Можете сами посмотреть

Проблема, для того чтобы построить эту историю, Eeshema должна была напечатать состояние схемы в каждый период времени(коммит). Вручную это делать трудно, да и нужно обладать определенным запасом терпения. Поэтому разработчики schhist создали патч для kicad который позволял запускать печать eeshema из командной строки. Но, увы этот патч не был включен в основное древо kicad. Разработчики говорили что EEshema будет переписана да и сам выходной формат поменяется с того что есть сейчас на S-expression как в PCBnew. Ну что же прошло 5 лет. Изменений всё нет, патч забросили и к актуальным версия KiCAD с вспомогательным трассировщиком и прочими плюшками от CERN. Пишу я это потому что в своё время на другом сайте, у меня была статья о schhist

kicad_sch2image

После того как в очередной раз мониторя судьбу schhist, я наткнулся на следующую статью где автор описывает ту же тему с ведением проектов kicad в git. И это заставило меня, а также желание в будущем написать плагин поддержки kicad в openPLM побудило меня написать программу для генераций изображений из файлов *.sch

Вот репозиторий

Пример применения

cd ~
mkdir usr
mkdir usr/bin
echo 'export PATH=$PATH:$HOME/usr/bin' >> ~/.bashrc
git clone https://github.com/Valber/kicad_sch2image.git
ln -s ~/kicad_sch2image/kicad_sch2image.py ~/usr/bin/kicad_sch2image
kicad_sch2image.py grow2_0.sch

kicad-diff

Теперь немного о практическом применении, давайте немного договоримся. Моя утилита писана на коленке и наполнена кучей костылей, честно скажу что под конец я уже ненавидел весь этот процесс, но это же open source здесь по другому никак, в общем защиты от дурака нет.

Как вести проект Вашей платы в git? Какой то определенной практики на просторах сети не видел. Для схематики важно чтобы в каждом коммите git присутствовала сама схема а также закэшированный файл с УГО(условно графическое обозначение) компонентов.

Итак предварительно мы создали проект в папке test_git_prj, также сразу создали файл схематики и сохранили его.

$ cd test_git_prj/
$ ls 
simple.bak  simple-cache.lib  simple.pro  simple.sch
git init
git add *
git commit -m "Initial commit"

Теперь небольшие подготовления

добавьте в корневой директории в файл .gitattributes

*.sch diff=kicad_diff

И в конец файла .git/config

[diff "kicad_diff"]
        command = "bash kicad-diff.sh"

И добавляем в наш проект следующий скрипт. Вкратце что он делает. На вход скрипта поступает HEX идентификаторы состояния файла, а также расположенных в /tmp два sch файла состояния.

Для того чтобы нам получить картинку нам нужно получить номер коммита, тут помог аноним с ЛОР. После того как номера коммитов получены. Мы находим файл являющийся в данном проекте закэшированной библиотекой УГО и с помощью команды git show получаем состояние файла в нужном коммите.

Далее генерируются картинки, потом они преобразуются в однотонно красные(старый файл) и однотонно зеленый(новый файл). Две картинки накладываются и мы получаем результирующий файл который открывает Просмотрщик в Вашей системе.

#!/bin/bash
# по мотивам http://we.easyelectronics.ru/bravikov/kontrol-versiy-kicad-proektov.html

# Скрипт, вызываемый Git'ом, для сравнения Kicad-схем ввиде svg-файлов.
# Скрипт сливает схемы в одно png-изображение, где
# удаленное - красным цветов, а добавленное - зеленым.
#
# Вызов: ./kicad-diff.sh path old-file old-hex old-mode new-file new-hex new-mode
# где:
#   path - имя файла
#   <old|new>-file - старая и новая версия файла
#   <old|new>-hex - SHA1-хеши из 40 шестнадцатеричных цифр
#   <old|new>-mode - восьмеричное представление прав доступа для файлов
# В параметры могут входить пользовательские рабочие файлы (например new-file из "git-diff-files"),
# /dev/null (например old-file при добавлении нового файла) или временные файлы (например old-file из индекса).
#

#echo Вызов $0
#$ (printf "commit %s\0" $(git cat-file commit HEAD | wc -c); git cat-file commit HEAD) | sha1sum

if [ $# -ne 7 ]
    then
        echo Неправильные аргументы 1>&2
        exit 1
fi

obj_name="$3"
oldcomm=$((git log --pretty=format:'%T %h %s';echo) \
 | while read tree commit subject
do
        if git ls-tree -r $tree | grep -q "$obj_name" ; then
                echo $commit
        fi
done)

obj_name="$6"
newcomm=$((git log --pretty=format:'%T %h %s';echo) \
 | while read tree commit subject
do
        if git ls-tree -r $tree | grep -q "$obj_name" ; then
                echo $commit
        fi
done)

OLD_SCH_FILE=$2
NEW_SCH_FILE=$5

for i in *-cache.lib
do
    LIB_SCH=$i
    echo $i
    [ "$i" = "*-cache.lib" ] && break
done

echo $LIB_SCH

OLD_LIB=/tmp/kicad-old.lib
NEW_LIB=/tmp/kicad-new.lib

git show $oldcomm:$LIB_SCH > $OLD_LIB
git show $newcomm:$LIB_SCH > $NEW_LIB
# git show aba3e24786f23597125de4489eb90a4faece58b0:grow2_0-cache.lib
# fatal: Path 'grow2_0-cache.lib' exists on disk, but not in 'aba3e24786f23597125de4489eb90a4faece58b0'.


kicad_sch2image.py --type=svg --target=$2 --library=$OLD_LIB
kicad_sch2image.py --type=svg --target=$5 --library=$NEW_LIB

OLD_FILE=${OLD_SCH_FILE%.sch}.svg
NEW_FILE=${NEW_SCH_FILE%.sch}.svg

OLD_PNG_FILE=/tmp/kicad-diff-old-file.png
NEW_PNG_FILE=/tmp/kicad-diff-new-file.png
RESULT_FILE=/tmp/kicad-diff.png

# Проверка существования утилит imagemagiсk
if [[ ! (-x `which convert`) || ! (-x `which composite`) ]];
    then
        echo "Ненайдены утилиты imagemagiсk"
        exit 1
fi

# Получить сравнение
convert -black-threshold 100% -fill red -opaque black -density 130 "$OLD_FILE" "$OLD_PNG_FILE"
convert -black-threshold 100% -fill green -opaque black -density 130 "$NEW_FILE" "$NEW_PNG_FILE"
composite -blend 50% -density 130 "$OLD_PNG_FILE" "$NEW_PNG_FILE" "$RESULT_FILE"

# Проверка существования утилит запуска

# Запустить просмотрщик изображений по умолчанию
if [ "$OS" = "Windows_NT" ]
    then
        if [[ -x `which start` ]]
            then start "$RESULT_FILE"
            else "Не возможно отобразить сравнение"
            exit 1
        fi
    else
        if [[ -x `which xdg-open` ]]
            then xdg-open "$RESULT_FILE"
            else "Не возможно отобразить сравнение"
            exit 1
        fi
fi

rm "$OLD_PNG_FILE" "$NEW_PNG_FILE" "$OLD_LIB" "$NEW_LIB"

exit 0

Дальше я предположу Вы рисуете блоки, фиксируете изменения в файлах. И вот вам понадобилось посмотреть разницу между двумя состояниями системы.

git diff 84c4d5998b7b9d9b869d07e0cfb19217931e7f2d simple.sch

И у Вас получится что то вроде этого,

kicad_diff_additional.png

или этого.

kicad_diff_rename.png

Скрипт работает неспешно,требует установленного пакета imagemagick. Честно говоря, к этой статье я хотел реанимировать исходный schhist, но нашел фатальный недостаток и теперь буду переписывать, но это ближе ко второй части.

Если будете тестировать, или чего то не поняли из статьи, чувствуете что чего-то не хватает, всегда рад дополнить.

Расходимся есть EEShow

Люди из проекта neo900 написали утилиту которая сооветствует schhist и в ней реализован весь нужный функционал и даже больше.

Подробнее на странице проекта или коротенько у нас.