Вопрос или проблема
Я ищу инструмент (предпочтительно с открытым исходным кодом) для визуализации логических схем, таких как эта
с следующими ограничениями:
- Описание схемы должно быть дано программно (через Java или предоставление какого-либо текстового описания, которое читается из файла; в основном, я хочу иметь возможность вызывать метод Java, который, в свою очередь, может запускать внешнюю программу; я НЕ хочу визуальный инструмент, который требует ввода от пользователя).
- Вывод должен быть в формате PDF.
- Если возможно, маршрутизация должна быть выполнена автоматически.
- Он должен работать на Windows.
Хотя это кажется довольно простым, я не нашел ничего удовлетворительного после обширных исследований. Инструменты, которые подошли ближе всего, были:
- пакет
tikz
для Latex (запуск Latex вполне допустим в моем контексте, но по какой-то причине комбинация Java и tikz сломалась, см. здесь: https://stackoverflow.com/questions/33298548/pdflatex-run-crashes-when-executed-from-java-on-windows; также, насколько я знаю, tikz не может автоматически маршрутизировать). - программа
blockdiag
(http://blockdiag.com/en/index.html), которая, если я не ошибаюсь, недоступна для Windows (и не имеет предопределенных логических элементов).
Я очевидно рассматривал graphviz, но проблема в том, что вы не можете указать graphviz, где именно ребра должны соединяться с узлами – что важно, если вы хотите указать входы и выходы.
Существует также этот вопрос на SE: https://stackoverflow.com/questions/6422603/circuit-block-diagram-drawing.
Но, не вдаваясь в детали, все предложения там не сработали для меня из-за вышеупомянутых ограничений.
Я ожидал, что это будет проблема, которая была решена много раз… (И может быть, я просто плохо искал в Google.)
Я бы предложил взглянуть на SchemDraw, который является пакетом python, который:
- может выводить результаты в форматах svg, eps или pdf,
- позволяет вам определять собственные компоненты,
- является кроссплатформенным (включая windows),
- бесплатен, безвозмездно и с открытым исходным кодом
- репозиторий исходного кода доступен
- Галерея примеров
- Поддерживает использование частей Fritzing как здесь.
- Работает на Windows, Linux, Mac и практически на всех платформах, где работает Python
- Может запускаться в Jupyter Notebook
- Может выводить в любом из форматов
svg
,eps
,png
,pdf
иjpg
при условии, что matplotlib поддерживает все это на вашей платформе.
Вы можете либо создавать схемы напрямую из python, либо определить свой собственный формат для хранения информации и парсить его.
Некоторые примеры из галереи:
Два разных способа представления схемы мигания LED на NE555.
import schemdraw
with schemdraw.Drawing() as d:
d.config(fontsize=12)
T = (elm.Ic()
.side('L', spacing=1.5, pad=1.5, leadlen=1)
.side('R', spacing=2)
.side('T', pad=1.5, spacing=1)
.pin(name="TRG", side="left", pin='2')
.pin(name="THR", side="left", pin='6')
.pin(name="DIS", side="left", pin='7')
.pin(name="CTL", side="right", pin='5')
.pin(name="OUT", side="right", pin='3')
.pin(name="RST", side="top", pin='4')
.pin(name="Vcc", side="top", pin='8')
.pin(name="GND", side="bot", pin='1')
.label('555'))
BOT = elm.Ground().at(T.GND)
elm.Dot()
elm.Resistor().endpoints(T.DIS, T.THR).label('Rb').idot()
elm.Resistor().up().at(T.DIS).label('Ra').label('+Vcc', 'right')
elm.Line().endpoints(T.THR, T.TRG)
elm.Capacitor().at(T.TRG).toy(BOT.start).label('C')
elm.Line().tox(BOT.start)
elm.Capacitor().at(T.CTL).toy(BOT.start).label(r'.01$\mu$F', 'bottom').dot()
elm.Dot().at(T.DIS)
elm.Dot().at(T.THR)
elm.Dot().at(T.TRG)
elm.Line().endpoints(T.RST,T.Vcc).dot()
elm.Line().up(d.unit/4).label('+Vcc', 'right')
elm.Resistor().right().at(T.OUT).label('330')
elm.LED().flip().toy(BOT.start)
elm.Line().tox(BOT.start)
Вы даже можете создавать графические элементы, например, вышеуказанный макет на печатной плате:
import schemdraw
from schemdraw import pictorial
elm.Line.defaults['lw'] = 4
with schemdraw.Drawing():
bb = pictorial.Breadboard().up()
pictorial.DIP().up().at(bb.E5).label('555', color="#DDD")
elm.Line().at(bb.A8).to(bb.L1_7)
elm.Line().at(bb.J5).to(bb.R1_4)
elm.Line().at(bb.A5).to(bb.L2_4).color('black')
pictorial.Resistor(330).at(bb.B7).to(bb.B12)
pictorial.LED(lead_length=.3*pictorial.INCH).at(bb.C12)
elm.Line().at(bb.A13).to(bb.L2_13).color('black')
pictorial.Resistor(520).at(bb.G6).to(bb.G3)
pictorial.Resistor(520).at(bb.J6).to(bb.R1_10)
elm.Line().at(bb.H3).to(bb.H7).color('green')
elm.Wire('c').at(bb.G7).to(bb.D6).linewidth(4).color('green')
elm.Line().at(bb.H8).to(bb.H12).color('green')
elm.Line().at(bb.J13).to(bb.R2_14).color('black')
pictorial.CapacitorMylar(lead_length=.2*pictorial.INCH).at(bb.I12)
elm.Line().at(bb.C6).to(bb.C3).color('green')
pictorial.CapacitorMylar(lead_length=.2*pictorial.INCH).at(bb.D2)
elm.Line().at(bb.A2).to(bb.L2_1).color('black')
Существует новый проект под названием netlistsvg, который может подойти; он все еще на ранних стадиях, но нацелен на логические схемы, особенно на синтез Verilog.
Ответ или решение
Для задачи программной визуализации логических схем и последующего экспорта в PDF на платформе Windows, существует несколько инструментов, которые могли бы удовлетворить ваши требования. Я хочу предложить детальный обзор подходящих решений с учетом ваших условий.
Основные требования
-
Программная генерация диаграмм:
Вы ищете инструмент, который позволяет описывать схемы программно, без необходимости использовать визуальные средства или ручной ввод. -
Экспорт в PDF:
Ваша задача состоит в том, чтобы итоговые диаграммы были доступны в формате PDF. -
Автоматическая маршрутизация:
Желательно, чтобы маршруты соединений между элементами схемы устанавливались автоматически. -
Кроссплатформенность:
Инструмент должен работать в операционной системе Windows.
Рекомендуемые инструменты
1. SchemDraw
SchemDraw – это мощный и бесплатный инструмент, написанный на Python, который позволяет создавать электрические схемы. Его основные преимущества включают:
- Вывод в нескольких форматах: PDF, SVG, EPS, PNG и JPEG.
- Определение собственных компонентов: Вы можете создать свои собственные элементы, что делает его гибким для различных приложений.
- Кроссплатформенность: Поддерживает Windows, Linux и Mac.
- FOSS: Этот проект является свободным и с открытым исходным кодом.
- Примеры и документация: Доступна обширная документация с примерами, что облегчает процесс начала работы.
Пример кода SchemDraw для создания логической схемы:
import schemdraw
import schemdraw.elements as elm
with schemdraw.Drawing() as d:
d.config(fontsize=12)
# Определяем компоненты схемы
resistor = elm.Resistor().label('R1').at((0, 0))
d += resistor
d += elm.Line().down()
В этом примере представлена простая схема с резистором, которую можно расширять, добавляя другие элементы. Результат можно легко сохранить в PDF.
2. netlistsvg
netlistsvg – это развивающийся проект, ориентированный на логику схем. Несмотря на то, что он находится на ранних стадиях, он уже демонстрирует способность генерировать логические диаграммы из текстовых файлов. Это может быть интересным вариантом для вашего проекта, так как он поддерживает Verilog и может быть адаптирован под ваши нужды.
Немного о других инструментах
-
TikZ: Хотя TikZ является мощным инструментом для создания графики в LaTeX, ваши упоминания об API и взаимодействии с Java указывают на сложности с интеграцией. Кроме того, автоматическая маршрутизация не является его сильной стороной.
-
Graphviz: Несмотря на то, что этот инструмент предназначен для визуализации графов, он не поддерживает контроль над точками соединения, что делает его менее подходящим для логических схем, где требуется точная конфигурация стыков.
Окончательные рекомендации
Для автоматизации создания логических схем с последующим экспортом в PDF и автоматической маршрутизацией графических элементов, SchemDraw представляет собой наиболее целесообразное решение с точки зрения простоты интеграции и функциональности. Если ваши требования развиваются по мере проекта, стоит обратить внимание на такие инструменты, как netlistsvg, которые могут предложить дополнительные возможности.
Эти решения позволят вам эффективно управлять процессом разработки логических схем, минимизируя ручной ввод и усилия, сохраняя высокое качество визуальных результатов.