Меню Рубрики

Установка плагинов на inkscape

Делаем простой редактор уровней на базе плагина к Inkscape

Вступление
Думаю многие программисты создали, или пробовали создать свою игру. Обычно процесс доходит до момента, когда основная часть всего написана, и нужно начинать строить уровни, игровые сцены, и т.д. Если использовать готовые решения, «из коробки» — например Unity, тогда проблем не возникает. Но могут появиться проблемы с лицензированием, поддержкой разных платформ — может кто-то хочет попробовать что-то поделать под Linux / Mac, где не всегда можно найти нужное решение. Да и начинающим игроделам интересней использовать что-то своё, лёгкое в разработке и наращивании функционала, адаптированное под себя. Для себя я нашёл решение в виде написания собственного небольшого плагина к Inkscape.
В свободное время мне интересно поковыряться в своей же библиотеке написанной на AS3 — да, да, флеш :D. Библиотека существует в виде обёртки на физический движок Box2D, использует кучу всего полезного — собственную state-machine, небольшие обёртки на твиннеры для программной анимации и систему частиц. В принципе, что-то играбельное, небольшое и на свой вкус стильное сделать можно. Так как я люблю OpenSource и удобство, то программирую во FlashDevelop. Естественно, что редактора графики там нет. Да и он вряд ли бы сильно помог в создании объектов со собственными параметрами. Вспомнил за Inkscape, его модульность, плагины, и за сам SVG — собственно XML, лёгок для парсинга. Решил писать плагин для Inkscape.

Проблемы
Начав искать информацию «по поводу», нашёл очень мало, один целый пример «Hello World plugin», а всё остальное плохо структурировано, и на английском. И python в качестве скрипт-языка для плагинов. Функциональный и не типизированный, ужас. Можно вроде писать плагины на руби, не пробовал. Но разобрав пример и посмотрев готовые модули, установленные вместе с Inkscape, понял что не всё так плохо. Нужно просто найти правильные методы работы со слоями и фигурами, определить что именно хочешь сделать, и запрограммировать. Далее уже в приложении парсим готовый SVG / XML — благо все языки имеют отличные инструменты для таких целей, подаём куда нужно — у меня специальный конструктор, и готово.

Структура готового SVG
Я решил каждый уровень задавать как отдельный слой в SVG, это важно продумать при создании плагина. Объекты физ. мира могут иметь форму круглую, квадратную и комплексную (выпуклый многоугольник или же несколько любых многоугольников через несколько шейпов) — требования Box2D. И естественно кучу параметров — как и физических, так и своих. Объекты идут как обычные для SVG, нормально отображаются в редакторе и имеют кучу кастомных тегов и параметров. Удобно для выделения разных типов тел — динамических, статических, подсвечивать их разным цветом. Пока только реализовал поддержку круглых тел и квадратных.
Важно: при операциях в Inkscape по перемещению и вращению в конечном SVG не изменяются параметры тел напрямую. Всё идёт посредством матриц трансформаций matrix для вращения и свойства translate для перемещения тела. Естественно уже при парсинге таких данных нужно применить немножко матричной математики.

Структура плагина
Плагин в Inkscape состоит из двух частей, двух файлов — например my_super_plugin.py и my_super_plugin.inx. Файл my_super_plugin.inx существует в виде набора специальных XML — тегов, что-то похожее на бины в Java. Он задаёт GUI окошечка плагина, входные параметры данных, типы кнопок, и т.д. На скриншоте ниже показано «моё детище».

Файл my_super_plugin.py задаёт собственно сам скрипт работы с SVG — файлом. Скрипт берёт его на вход, делает нужные действия и подаёт на выход, Inkscape всё отрисовывает. Быстро и красиво. Насколько я понял, в скрипте код и Inkscape связаны через модуль inkex.py. На официальных страницах документации к редактору объяснены нужные типы данных для my_super_plugin.py и my_super_plugin.inx (ссылки внизу).

INX
Выкладываю код моего .inx файла:

имеет внутри свойство enum — внешне задаётся выпадающий список. При нажатии на ОК все параметры идут на вход к питоновскому скрипту, текущее значение на выпадающем списке тоже есть параметром. Значение param name должно совпадать с параметрами, объявленными как входящие в питоновском скрипте. Ах да, визуально в плагине можно создавать вкладки — попробовал, мне не подошло.

PY
Теперь я покажу свой скрипт, который делает всю работу по наполнению тегами файла с уровнями:

Читайте также:  Установка планар на парнасе

Строки вида self.OptionParser.add_option(‘—layer_name’, action=’store’,
type=’string’, dest=’layer_name’, default=’Game objects’,
help=’Layer name which objects append to’) задают входящие параметры, их тип (имена параметров с именами из .inx совпадают). Далее в функции effect данные, входные для скрипта, запихиваются в переменные. Потом я ищу что-то типа for item in d_root:
if (item.attrib.get(‘ ) == layer_name) : в SVG слои имеют свойство id, и туда я запихиваю именно ‘pf_go_id’ , для простоты идентификации «своих слоёв» с уровнями. Если слой уже существует, мы будем добавлять новые объекты в него, если нет — создаём новый слой, «уровень», и работаем с ним. Следующие строки создают слой, и уже внутри функции generate_object я создаю объекты. Думаю, что там всё понятно.

SVG
И, собственно, пример сгенерированного SVG файла:

Если загрузить в редактор, увидим несколько объектов и два слоя — уровни Menu и Level_1. Зелёные фигуры будут неподвижными, красные подвижными. У меня есть параметр тел isSensor, я его не выделял цветом, хотя можно визуально добавить прозрачность. На слое Menu прямоугольники повёрнуты и передвинуты — поэтому появились свойства matrix и translate внутри тегов rect. Как известно, они отвечают за поворот (и не только), и за перемещение соответственно. Уже в целевом приложении всё считываем и обрабатываем. Пишем классы для матриц и решаем матричное уравнение вида Ax=B (:D). Оттуда достаём настоящие координаты тел и угол поворота. Если будет интересно — расскажу как такое сделать на AS3, так как сейчас пост вышел довольно большим.

источник

Extensions

Arrange

Restack.

Расширение Restack позволяет быстро изменить Z-порядок элементов. Особенно удобно, если объекты упорядочены и частично перекрывают друг друга как черепица. Тогда вы можете быстро изменить направление перекрывающих частей: слева направо или наоборот. Также есть кнопка для случайного варианта.

Color

Настройки, связанные с обработкой цвета. По названиям понятны их назначения, приведу часть из них.

  • Brighter — делает объект ярче
  • Darker — делает объект темнее
  • Grayscale — Меняет цвет всех объектов на оттенки серого
  • Negative — негатив
  • Randomize — меняет цвет в случайном порядке
  • Replace color — меняет цвет на указанный

Generate from Path

Extrude

Позволяет создать объёмную фигуру из двух контуров. Для примера создал два прямоугольника, преобразовал в контур и вызвал расширение.

Interpolate

Преобразует один контур в другой с сохранением промежуточных результатов.

Modify Path

Color Markers

По умолчанию маркеры рисуются чёрным цветом. Расширение поможет изменить цвет.

Envelope

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

Perspective

Для опытов нужно взять два объекта, преобразовать их в Object to Path и выбрать первый объект, к которому нужно применить перспективу и затем второй объект-цель.

Render

Очень интересный раздел, требующий изучения.

3D Polyhedron

Можно выбрать готовые варианты моделей (находятся в папке share\extensions\Poly3DObjects) или загрузить свой вариант файла OBJ. Для этого скачайте obj-файл, скопируйте в указанную папку и выберите вариант Load from file, а затем введите имя файла.

Например, я скачал с сайта модель кота и импортировал в приложение.

Примеры использования: 3D Polyhedron — футбольный мяч.

Barcode

Позволяет создавать штрих-коды разных типов: Classic, Datamatrix, QR Code.

Calendar

Позволяет быстро создать календарь с нужными настройками.

Рисует шестерёнки (Gear) и реечные передачи (Rack Gear).

Grids

Random Tree.

Triangle.

Позволяет создать треугольник по заданным параметрам.

Wireframe Sphere

Настройки, связанные с текстом.

Lorem ipsun

Нужно быстро добавить заготовку текста? Создаём с помощью инструмента Text область для ввода текста, выбираем данное расширение и готовый текст появится в нём.

Visualize Path

Интересное расширение для работы с контурами.

Dimensions

Превращает контуры в чертёж с указанием размеров. Нарисуем подобие окна с форточкой. Выбираем отдельно первый прямоугольник и вызываем расширение. Повторяем для второго прямоугольника. Лишние стрелочки можно удалить или отредактировать. Для этого нужно снять группировку. Затем можете вписать свои размеры.

После снятия группировки также можно попробовать изменить маркеры через расширение Color Markers (см. выше).

Measure Path

После установки маркеров из предыдущего примера вы можете воспользоваться этим расширением, чтобы проставить значения расстояний между объектами.

Draw Handles

Рисует рычаги узлов. Может кому-то пригодится.

Number Nodes

Расширение, которое поможет создать игрушку. Рисуем контур, добавляем по желанию дополнительные узлы, вызываем расширение и вместо контура увидим пронумерованные точки. Осталось распечатать и отдать детям, чтобы они соединяли точки по порядку.

Читайте также:  Установка винир или люминиров

Сторонние расширения

Можно устанавливать расширения, созданные другими разработчиками. Для этого в папку Inkscape/share/extensions следует скопировать два файла с расширением PY и INX.

Inkscape-jigsaw/Lasercut Jigsaw

Расширение, позволяющее создать кусочки пазла.

Скачайте с Гитхаба файлы Lasercut-jigsaw.inx и Lasercut-jigsaw.py и разместите в папке (см. выше).

В меню Inkscape появится новый пункт Extension | Render | Lasercut Jigsaw.

Вызовите диалоговое окно и установите нужные настройки. После нажатия кнопки Apply у вас появится заготовка.

Дважды разгруппируйте заготовку. Далее скомбинируйте их Path | Combine.

Создайте прямоугольник и положите его под заготовку. Выберите оба объекта и примените к ним операцию Path | Division.

источник

Реечная передача и плагины для Инкскейпа

В прошлый раз я сказал, что инструмент для отрисовки шестерёнок в Инкскейпе «Расширения > Отрисовка > Зубчатое колесо. » в качестве единицы измерения использует только абстрактные пиксели и не позволяет выбрать физические меры длины, которые лучше подойдут для нужд реального цифрового производства, например миллиметры.

К нашей удаче, Inkscape является свободным программным обеспечением, а это значит, что любой можеть исправить в нем найденные недочеты или добавить недостающие функции не дожидаясь, пока это решат сделать обладатели проприетарной кодовой базы.

В случае с расширениями для отрисовки объектов в Inkscape всё еще проще — они представляют собой скрипты на языке Python и конфигурационные файлы в формате XML, которые можно добавлять и редактировать в любом текстовом редакторе и запускать на любом компьютере с установленным Inkscape (все приложение целиком собирать из исходников не нужно).

В диалог с параметрами шестерёнки добавил новый параметр «Единица измерения» (англ. Unit), который определяет единицу измерения для параметра «Шаг колеса» (на картинке с русским переводом он превратился в английскую версию Circular pitch, т.к. из строки с именем параметра я убрал уточнение по пиксели и из-за этого поплыли файлы с переводом, которые я не исправлял). К параметрам «Количество зубцов» и «Угол зацепления» он не относится.

Чтобы установить исправленное расширение у себя в системе, нужно скачать два файла:
inkscape/extensions/gears1.inx (файл XML с настройками расширения)
inkscape/extensions/gears1.py (код расширения на языке Пайтон)

и скопировать их в каталог

/.config/inkscape/extensions в Linux или в C:\Users\user\AppData\Roaming\inkscape\e xtensions в Windows. После этого перезапустить Inkscape, исправленный диалог для отрисовки шестеренки появится в меню «Расширения > Отрисовка > Gear1. » (я исправил имя на временное Gear1, чтобы не вносить путаницу со старым расширением; при желании можно также просто исправить расширение «Зубчатое колесо» из стандартной поставки Инкскейпа, для этого нужно заменить содержимое файлов gears.inx и gears.py в каталоге C:\Program Files (x86)\Inkscape\share\extensions в Windows на содержимое файлов, приведённых выше).

Также в текущей версии Inkscape вообще отсутствовала возможность нарисовать плоскую дощечку с зубами от шестерёнки (реечная передача, англ. rack and pinion). Такая штука может оказаться полезной для того, чтобы превращать вращательное движение с моторчиков и сервомоторчиков в поступательное движение рейки; пригодится при проектировании каких-нибудь подвижных узлов для роботизированных механизмов, которые можно будет вырезать лазером.

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

Их нужно точно также скопировать в каталог

/.config/inkscape/extensions в Linux или в C:\Users\user\AppData\Roaming\inkscape\e xtensions в Windows, перезапустить Inkscape, новый диалог для отрисовки реечной передачи появится в меню «Расширения > Отрисовка > Rack and pinion. »

Чтобы нарисовать совместимые между собой зубчатое колесо и реечную передачу, нужно при их создании задать одинаковые значения параметров «Шаг колеса» (Circular pitch) и Угол зацепления (Pressure angle); количество зубцов в обоих случаях может быть любым.

Я также отправил ссылки на эти исправления в багтрекер Inkscape и в процессе выяснил, что, во-первых, в репозитории с исходным кодом уже есть новое расширение для отрисовки реечной передачи (вероятно, оно может появиться уже в следующем релизе), во-вторых, в работе есть еще одна улучшенная версия расширения для отрисовки зубчатого колеса с большим количеством дополнительных параметров.

Читайте также:  Установка dash 8 q400 fsx

Собственное расширение для Inkscape: код на Пайтон рисует прямоугольник

Ну и напоследок посмотрим, как можно легко добавлять собственные расширения в Inkscape. Как я уже сказал выше, с механизмом расширений двумерные векторные объекты на рабочей области Inkscape можно рисовать при помощи программы на языке Python. Это довольно мощная возможность, т.к. с её помощью для рисования объектов можно использовать какие-нибудь интересные математические формулы или же просто генерировать сложные структуры из множества узлов, имея под рукой все возможности процедурного языка типа сложных условий, циклов и подпрограмм.

Попробуем добавить к Inkscape расширение, которое будет рисовать прямоугольник с заданной шириной и высотой (функция не самая полезная, т.к. прямоугольники гораздо удобнее рисовать при помощи специального инструмента мышкой, но для быстрого знакомства самое то). В диалоге отрисовки прямоугольника будет 3 параметра: ширина (Width), высота (Height) и единица измерения (Unit) для этих значений:

Сначала создаём и правим файл XML demo_rectangle.inx, который содержит базовую информацию о расширении: имя, уникальный идентификатор, список скриптов Пайтон, которые необходимы для его работы, список параметров для скрипта (диалог генерируется автоматически на основе этого списка), адрес в главном меню программы, ссылка на исполняемый скрипт на языке Пайтон (demo_rectangle.py).

Второй и последний файл — скрипт на языке Python, которые будет генерировать наш прямоугольник с заданными параметрами.

Здесь мы видим некоторое количество вспомогательного кода: добавление параметров в объект self.OptionParser (они должны быть все те же, что перечислены в файл demo_rectangle.inx), чтение параметров с нужной размерностью, запуск расширения с e.affect().

Сам прямоугольник создаётся в одной единственной строке — координаты вершин на плоскости помещаются в массив points. В этой части будет больше интересного кода в том случае, если расширение будет рисовать что-то более полезное, чем простой прямоугольник.

Далее из точек в массиве points просто генерируется правильный код SVG для добавления на рабочую область, я не сильно вникал в то, что именно он делает, просто взял из кода подвернувшегося под руку соседнего расширения.

источник

Установка и использование дополнительных фильтров в Inkscape:

Редактор Inkscape позволяет использовать дополнительные фильтры. Фильтры можно скачать с официального сайта проекта или создавать самому. Итак, идем на сайт проекта в раздел Addons (Дополнения).

Использование фильтров

Справа в категориях ищем набор фильтров (Inkscape filter set).

Давайте возьмем paper filter pack и pencil filter pack.

Скачиваем оба файла. Файлы фильтров в svg формате необходимо записать в каталог

C:\Program Files\Inkscape\share\filters

После загрузки редактора Inkscape фильтры станут доступны в разделе Фильтры — из поставки. В этом разделе мы найдем 20 образцов бумаги (paper1-paper20) и карандаши разной мягкости. Давайте задействуем новые фильтры и создадим несложное изображение. Например, в стиле граффити.

Запускаем редактор inkscape и создаем прямоугольник серого цвета.

Или прямоугольник с любой градиентной заливкой. Я выбрал сетчатый градиент.

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

Далее создаем кирпичи. Поступаем так: рисуем линии нужного цвета и из линий, дублируя их (CTRL+D), создаем кирпичи.

После создания кирпичей, группируем все линии, нажав CTRL+G. Это нужно сделать для последующего применения фильтров. В результате имеем вот такую стену.

Пока не очень. Оживляем.
Дублируем группу линий CTRL+D. И уменьшаем толщину обводки. Обводку делаем черной.

размещаем под группой линий белого цвета.

Теперь делаем надпись. Печатаем подходящим шрифтом что-нибудь и оконтуриваем. (Меню — контур- оконтурить объект).

С помощью инструмента Редактировать узлы слегка искажаем надпись.

Для создания тени дублируем надпись. Для каждой буквы создаем градиентную заливку и обводку. Копию черного цвета размещаем под основным текстом. У меня получилось так.

Ну и завершаем. Выделяем стену и последовательно применяем «Рваные края» (Меню Фильтры — Искажения — рваные края) и Paper (Меню Фильтры — Из поставки)

Затем к кирпичам применяем три раза фильтр Paper (Меню Фильтры — Из поставки).

Ну и к надписи тоже применяем тот же фильтр Paper (Меню Фильтры — Из поставки) не менее трех раз.

Да простят меня фанаты этого жанра- вроде похоже.

источник