LINUX.ORG.RU

Ищу двумерный аналог OpenSCAD

 , , ,


1

2

Привет, ЛОР.

Для 3D есть такая замечательная штука как OpenSCAD. Где можно наколхозить программно, например, 5 цилиндров в цикле, раскрасить, трансформировать и всё это экспортировать.

А есть ли что-то аналогичное для двумерного рисования? Чтобы рисовать на скриптовом языке линии, круги, многоугольники, текстовые вставки, закрашивать всё это? Потом экспортировать в векторный (SVG) либо растровый (PNG) файл.

В принципе, в самом OpenSCAD 2D-примитивы имеются. Но вот как задать толщину обрамляющей линии для square, например, я так и не нашёл (да, подозреваю, что можно наложить два square через difference, но это уже лютый колхоз и натягивание филина на глобус, если мне нужно просто порисовать квадратики и линии).

С экспортом тоже проблема. Я нарисовал в опенскаде два разноцветных квадратика. Сохранил в SVG. Потом открываю что в gimp, что в inkscape – вожделенная плоская картинка есть, но информация о цвете потеряна. А «Экспорт в растр» из OpenSCAD вместо плоской картинки записывает в PNG вид на трёхмерную сцену (и я его не обвиняю, он, в общем-то, для другого делался).

В общем, ищется более подходящий инструмент.

В принципе, есть подозрение, что большая часть моих хотелок закрывается скриптингом, к примеру, на питоне (или другом скриптоЯП общего назначения). Если есть для него простейшая библиотека рисования, которая умеет не только на экран вывести, но и в файлик вывести (те же PNG и SVG, на крайняк обойдусь каким-то одним из них) – сойдёт, хоть это и менее удобно, чем специализированный инструмент. Есть такое (желательно с примерами)?

Обновление: всем спасибо за советы, остановился на PyCairo. Совет писать простой SVG вручную тоже интересен, там оказалось не так сложно, как я думал. Может, как-нибудь тоже пригодится.

★★★★★

Последнее исправление: hobbit (всего исправлений: 4)
Ответ на: комментарий от aol

Поставил librecad (не потому, что он libre, а потому, что и по количеству зависимостей, и по объёму раз в 10 меньше фрикада). Да, есть там поле ввода командной строки. Но судя по мануалу, это больше похоже на терминал с вводом отдельных команд, а не на полноценный скриптинг с циклами и функциями:

https://docs.librecad.org/en/latest/guides/cmdline.html

FreeCAD – да, это полноценная САПР с 3D. Не оно.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от dataman

Судя по тому, что я вижу на главной, оно больше под диаграммы всякие заточено. Где не важны координаты, но важны квадратики и связи между ними. Т.е. не к векторному редактору ближе, а к моделлеру (как PlantUML). Но могу ошибаться. Исходники качнул.

Документацию пока не нашёл. Из интересного – репа на fossil.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от EAT_INSIDE

Это типа мне возмездие за то, что я неоднократно называл XML человекочитаемым языком? «Шутку понял, смешно».

Но человекочитаемый и человекомпишущийся – всё-таки разные вещи, path d с длинной очередью циферок – это не то. Ну и мне нужно не только текстовое представление фигур как таковое, но и скриптинг (те самые 10 цилиндров в разных позициях, грубо говоря), сомневаюсь, что SVG мне это даст.

Ну посмотрите на OpenSCAD, для 3D он идеален. Вот мне нужно то же самое для 2D с границами и с нормальным экспортом.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Ну и мне нужно не только текстовое представление фигур как таковое, но и скриптинг (те самые 10 цилиндров в разных позициях, грубо говоря), сомневаюсь, что SVG мне это даст.

Можно в defs задать фрагмент и потом лепить его в разные места с трансформациями. А скрипты можно на JS забацать.

<?xml version="1.0" encoding="UTF-8"?>
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
  <defs>
    <g id="label">
      <rect x="0" y="0" width="384" height="224" fill="#fff" stroke="#777" stroke-width="3" rx="8"/>
    </g>
    <g id="protector">
      <rect x="0"  y="0" width="256" height="180" fill="#aaa" stroke="#777" stroke-width="2" rx="8"/>
      <rect x="24" y="24" width="48" height="132" fill="#333" stroke="#777" stroke-width="2" rx="2"/>
    </g>
    <g id="flop">
      <rect x="0" y="0" width="512" height="512" fill="#333" stroke="#777" stroke-width="3" rx="18"/>
      <use href="#label" x="64" y="12" />
      <use href="#protector" x="96" y="332" />
    </g>
  </defs>
  <use href="#flop" x="88" y="2" transform="scale(0.85)"/>
  <use href="#flop" x="2" y="88" transform="scale(0.85)"/>
</svg>
u-235
()
Ответ на: комментарий от dataman

Так от создателя SQLite же! :)

А! У-уу. Вот оно как… Тогда точно стоит потыкать.

Правда, что-то пока ни тарболл не качается, ни документация. То ли на сайте ЛОР-эффект, то ли с моим хилым гостиничным вайфаем проблемы (но опенскад и либрекад из реп Федоры этот хилый вайфай успешно скачал).

hobbit ★★★★★
() автор топика
Ответ на: комментарий от u-235

Всё-таки как-то очень уж громоздко. (Кстати, я это скопипастил в файл, gimp показал дискетки, а inkscape почему-то пустой холст.)

Филину всё ещё больно. Но если ничего компактнее и изящнее не найду – воспользуюсь.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 2)

Какой-нибудь pycairo. Возможно там и булевы операции есть как в опенскаде.

import cairo

with cairo.SVGSurface("example.svg", 200, 200) as surface:
    context = cairo.Context(surface)
    x, y, x1, y1 = 0.1, 0.5, 0.4, 0.9
    x2, y2, x3, y3 = 0.6, 0.1, 0.9, 0.5
    context.scale(200, 200)
    context.set_line_width(0.04)
    context.move_to(x, y)
    context.curve_to(x1, y1, x2, y2, x3, y3)
    context.stroke()
    context.set_source_rgba(1, 0.2, 0.2, 0.6)
    context.set_line_width(0.02)
    context.move_to(x, y)
    context.line_to(x1, y1)
    context.move_to(x2, y2)
    context.line_to(x3, y3)
    context.stroke()
neumond ★★
()
Ответ на: комментарий от hobbit

Правда, что-то пока ни тарболл не качается

Вот что значит не использовать Debian! Там pikchr есть. :)


Вспомнил, что я когда-то добавлял поддержку pikchr в lowdown, но автор отказался. Надо будет попытать счастья с https://github.com/mity/md4c. :)

dataman ★★★★★
()

А тебе точно нужен кад, а не редактор диаграмм? Программируемый кад это cadquery, но я его не умею, поэтому не знаю, что там с оформлением. А вот скриптового рисования диаграмм вроде достаточно понаписано.

Python diagrams, mermaid, d2, plantuml, еще всякое такое.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 2)

Ну наверно самое близкое именно в стиле OpenSCAD но 2D будет G-code, внезапно. В полноценной версии, где можно циклы, условия, всякие кривулины, трансформации осей и т.п. Цвет/толщину можно типом инструмента задавать. Оно, конечно и 3D и 4D и даже 5D и выше может, но все примитивы там только 2D.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)

Приходит в голову yed, но вот как там с параметризованной анимацией - не знаю, не уверен. Что-то было для работы с данными, но я в нем только сетевые диаграммы рисовал

skyman ★★★★★
()
Ответ на: комментарий от Stanson

Ну наверно самое близкое именно в стиле OpenSCAD но 2D будет G-code, внезапно.

Не будет. G-code это ад и холокост с ущербным синтаксисом. К тому же непонятно как из этих кодов получить svg.

u-235
()
Ответ на: комментарий от hobbit

librecad

Он точно нет, т.к. в нём «консоль» вот просто чтоб была.

FreeCAD

Он, конечно, монструозен, но вообще много чего умеет. У него есть свой модуль OpenSCAD. Да и вообще, практически всё, что можно сделать тыкая мышкой, можно сделать скриптами (но не всегда понятно как).

Пример из вики с размерными линиями:

import FreeCAD as App
import Draft

doc = App.newDocument()

p1 = App.Vector(0, 0, 0)
p2 = App.Vector(1000, 1000, 0)
p3 = App.Vector(-2500, 0, 0)
dimension1 = Draft.make_dimension(p1, p2, p3)
dimension1.ViewObject.FontSize = 200

polygon = Draft.make_polygon(3, radius=1000)
doc.recompute()

p4 = App.Vector(-2000, 1500, 0)
dimension2 = Draft.make_dimension(polygon, 1, 2, p4)
dimension2.ViewObject.FontSize = 200

center = App.Vector(2000, 0, 0)
p5 = App.Vector(3000, 1000, 0)
angle1 = 45
angle2 = 10
dimension3 = Draft.make_angular_dimension(center, [angle1, angle2], p5)
dimension3.ViewObject.FontSize = 200

dimension4 = Draft.make_angular_dimension(center, [angle2, angle1], p5*1.2)
dimension4.ViewObject.FontSize = 200

doc.recompute()
Jullyfish
()

Самый простой вариант это взять и написать SVG руками. Конечно если там циклы и т.п., то будет неудобно, хотя некоторые интересные возможности в формате есть.

Вариант чуть продвинутей это сделать SVG в котором внутри будет JavaScript, генерирующий сам себя. Но такое будет работать только в браузере.

Если надо, чтобы работало везде - написать отдельную программу, генерирующую SVG. Для генерации или просто выплёвывать текст, или использовать библиотеку для XML, например генерировать DOM-дерево в памяти и потом его выводить. Язык программирования любой, разницы не будет.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от aol

parametric

Только в OpenSCAD этого нет, к сожалению, там всё максимально примитивно. Хотя с какой-то стороны может оно и к лучшему. Но мне было бы интересно попробовать параметризованный CAD, в котором орган управления это текст. Наверное это должен быть просто движок для параметрического моделирования с минимальной обвязкой.

vbr ★★★★★
()

Я может чего не понял, но разве ты не cairo/skia/blend2d хочешь ? Или речь прям о черчении ? Тогда чем сам openscad не устроил - он же вполне себе поддерживает 2d режим, есть двумерные примитивы. Как вариант можешь посмотреть ещё CadQuery, но он по сути тот же openscad, только с питоном вместо своего языка и у него есть 2d примитивы

anonymous
()
Ответ на: комментарий от anonymous

Стоит иметь ввиду, что это более низкоуровневая штука.

Попробовал. С линиями, прямоугольниками и кривыми там всё как раз на таком уровне, который мне нужен, рисует замечательно. Вот show_text() пока заставить работать не получилось…

hobbit ★★★★★
() автор топика

Неплохо бы уточнить, что требуется на выходе — точные чертежи/маски/фотовывод или иллюстрации/диаграммы?

Потому что *CAD(/CAM/CAE) — это скорее заточено на физические объекты и их представление в той или иной форме.

Если всё же речь идёт о векторной иллюстрации — помимо очевидных TikZ/PGF, PSTricks, graphviz и биндингов к libcairo, есть:

— Asymptote (https://asymptote.sourceforge.io/)

Самобытный скриптовый язык для векторных иллюстраций. Буквально первый же пример из галереи как раз по теме: https://asymptote.sourceforge.io/gallery/CAD1.asy, вывод выглядит так — https://asymptote.sourceforge.io/gallery/CAD1.svg (можно попробовать в веб–версии: https://asymptote.ualberta.ca/).

— IPE (https://ipe.otfried.org/)

Векторный редактор для совместного использования с LaTeX. Написан на Qt и Lua и полностью скриптуется на оном (https://ipe.otfried.org/ipelib/lua.html). Нативный формат изображений свой, XML–based, есть вязанка импортёров/экпортёров во что угодно. Можно поглядеть веб–версию (https://ipe-web.otfried.org/index.html). Помимо непосредственного расширения интерфейса, есть возможность выполнять голые скрипты, с помощью ipescript.

Quote
()
Ответ на: комментарий от anonymous

Я же прямо в ОП написал, чем меня сам OpenSCAD не устроил, конкретные технические вопросы (при этом допускаю, что я просто не нашёл, как их решить, если кто знает - welcome в комментарии).

Нет, речь не о черчении, и большие САПРы мне не нужны. Речь например, про иллюстрации к статьям и тому подобное.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от thesis

Кстати, моя хотелка прекрасно описывается твоим же комментарием полугодовой давности:

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

С той поправкой, что мне нужны не диаграммеры, как в той теме (тогда действительно взял бы PlantUML), а несложная векторная графика общего назначения. Только называть это кадом (по-русски САПР) у меня язык не поворачивается, я в данном случае ничего такого не проектирую, так, иллюстрации к статьям порисовать.

Про CadQuery, кстати, пишут, что оно тоже в основном про 3D. Проверять не стал, поскольку залип на PyCairo, и в целом она меня (несмотря на моё опасливое отношение к питону) вполне устроила. Отметил тему решённой.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

D2, емнип, умеет кастомные примитивы в SVG. Да и не он один, наверняка.

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

thesis ★★★★★
()