С появлением систем контроля версий, их начали применять для всего подряд. Действительно система контроля версий позволяет зафиксировать некие состояния системы и потом возвращаться к ним. Это набор минимум.
Благодаря тому, что kicad хранит свои данные в текстовых файлах, а не в бинарниках, это позволяет использовать git и прочие системы контроля версий для ведения проектов.
Под катом вас ждет статья о том как сделать работу с git чуть удобней при проектировании в kicad.
Table of Contents
В свой время небольшая фирма Qi-Hardware разрабатывая открытую электронику в свободном программном обеспечении создала для себя набор вспомогательных инструментов. Среди них была утилита schhist которая строила графическую историю изменений.
Проблема, для того чтобы построить эту историю, 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
И у Вас получится что то вроде этого,
или этого.
Скрипт работает неспешно,требует установленного пакета imagemagick. Честно говоря, к этой статье я хотел реанимировать исходный schhist, но нашел фатальный недостаток и теперь буду переписывать, но это ближе ко второй части.
Если будете тестировать, или чего то не поняли из статьи, чувствуете что чего-то не хватает, всегда рад дополнить.
Расходимся есть EEShow
Люди из проекта neo900 написали утилиту которая сооветствует schhist и в ней реализован весь нужный функционал и даже больше.
Подробнее на странице проекта или коротенько у нас.