Данный проект представляет собой реализацию векторного графического редактора с системой управления учётными записями в рамках проектно-технологической практики кафедры ИУ9 в 2022 году
Наш сайт http://artemnostrum.yss.su
Инструкции ниже помогут вам загрузить и запустить копию проекта для личного использования на вашей локальной машине.
- python: 3.8.10 и выше
- для unix обязательно иметь пакет python3-venv
-
Скопируйте репозиторий в вашу директорию и перейдите в корень проекта
$ git clone <репозиторий> --branch=main $ cd ptp2022-7-svg-editor
-
Создайте виртуальную среду и активируйте ее
$ python3 -m venv venv $ source venv/bin/activate
Windows
> python -m venv venv > venv\Scripts\activate
-
Установите зависимости
(venv) $ python3 -m pip install --upgrade pip (venv) $ pip install -r requirements.txt
-
Сделайте миграции
(venv) $ python manage.py migrate
(venv) $ python manage.py runserver
Для работы в редакторе необходимо создать учётную запись, с которой вы сможете хранить созданные файлы на сервере, открывать их для продолжения работы, а также импортировать файлы со своего компьютера.
- Если у вас ещё нет учётной записи, перейдите на страницу регистрации, нажав на ссылку на странице авторизации.
- Следуя инструкциям, заполните необходимые поля на странице регистрации. Нужно иметь в виду, что имя пользователя и электронный адрес не должны совпадать с данными уже существующих пользователей, а введенные пароли должны совпадать между собой. При соблюдении условий эти поля будут обведены зеленым цветом, при несоблюдении – красным.
- После создания учётной записи необходимо подтвердить адрес электронной почты, указанный при регистрации. Вам будет выслано письмо с ссылкой, после нажатия на которую откроется страница, уведомляющая о подтверждении адреса.
- При наличии учётной записи заполните поля на странице авторизации для начала работы.
- Если вы забыли пароль к своей учётной записи, нажмите на соответсвующую ссылку.
-
- Заполните поле, введя электронный адрес. Письмо с ссылкой на страницу восстановления пароля будет отправлено на указанный адрес, если к нему привязана существующая учётная запись.
- Заполните поля на странице восстановления пароля. Введенные пароли должны совпадать между собой. При соблюдении условия эти поля будут обведены зеленым цветом, при несоблюдении – красным.
- После авторизации открывается личный кабинет пользователя, где вы можете сменить пароль, выйти из учётной записи или приступить к работе в редакторе.
- Для смены пароля нажмите на соответствующую ссылку в личном кабинете.
- Заполните поля, следуя инструкциям. Введенные пароли должны совпадать между собой. При соблюдении условия эти поля будут обведены зеленым цветом, при несоблюдении – красным.
- После смены пароля откроется страница, уведомляющая об успешной смене пароля.
- При нажатии To editor в личном кабинете пользователя открывается страница управления файлами.
- Вы можете создать новый файл, выбрав один из двух доступных форматов – svg или yml.
- Имейте в виду, что имя нового файла не должно совпадать с именем уже существующего файла. При соблюдении условия эти поля будут обведены зеленым цветом, при несоблюдении – красным.
- У вас есть возможность импортировать файл с вашего компьютера для работы в редакторе. При попытке загрузить файл не в svg или yml формате появится уведомление о недопустимости этого формата.
- Чтобы просмотреть файлы, хранящиеся на сервере, нажмите на кнопку Reload. Для открытия файла выберите нужный среди тех, которые появились в списке, и нажмите на кнопку Open.
- Все инструменты, кроме курсора, не реагируют на нажатия мыши за пределами холста.
- После окончания рисования любым инструментом, кроме зеркала, действующий объект выделяется линиями голубого цвета.
- При любом активном действии на панели параметров или инструментов или после нажатия клавиши
Esc
выделения стираются и в случае, если использование инструмента не было закончено, последнее действие безвозвратно отменяется. Объектом на координатах
далее будет обозначаться объект, которому принадлежит точка с данными координатами, лежащий на активном слое и для которого не найдётся другого объекта на активном слое такого, что ему так же будет принадлежать данная точка и он будет находиться выше первого.
- При нажатии ЛКМ1 не дальше 30-ти пикселей хотя бы от одной из границ холста эта или эти границы становятся сдвигаемыми движениями курсора мыши с зажатой клавишой. При этом все объекты холста не меняют местоположения относительно страницы.
- В случае, если таких границ не нашлось, и координаты нажатия мыши пришлись на холст, за любым последующим движением курсора мыши следует перемещение холста вместе с его содержимым по странице.
- При зажатой ЛКМ1 происходит рисование полилинии по тем точкам, на которых было зафиксировано движение курсора мыши с зажатой клавишей.
- В случае клика мышки без её перемещения объект не создаётся.
- При нажатии ЛКМ1 устанавливаются две точки линии.
- При движении курсора мыши с зажатой ЛКМ перемещается вторая точка.
- При отпускании ЛКМ рисование заканчивается.
- При первом нажатии ЛКМ1 устанавливаются первые две точки многоугольника.
- При движении с зажатой кнопкой изменяются координаты последней точки многоугольника.
- После очередного нажатия ЛКМ в конец массива точек многоугольника добавляется новая точка.
- При перемещении курсора мышки без зажатой ЛКМ более чем на 10 пикселей от последней установленной точки рисование прекращается.
- При нажатии ЛКМ1 устанавливаются две точки, обозначающие противоположенные углы прямоугольника.
- При движении курсора мыши с зажатой ЛКМ перемещается вторая точка.
- При отпускании ЛКМ рисование заканчивается.
- При нажатии ЛКМ1 устанавливаются две точки, обозначающие противоположенные углы прямоугольника, в который вписан эллипс.
- При движении курсора мыши с зажатой ЛКМ перемещается вторая точка.
- При отпускании ЛКМ рисование заканчивается.
- При нажатии ЛКМ1 устанавливаются две точки, обозначающие противоположенные углы прямоугольника, в который вписана правильная пятиконечная звезда.
- При движении курсора мыши с зажатой ЛКМ перемещается вторая точка.
- При отпускании ЛКМ рисование заканчивается.
- При первом нажатии ЛКМ1 создаётся кривая Безье2 с началом, концом и контрольными точками на координатах курсора мыши.
- При движении курсора мыши с зажатой кнопкой изменяются координаты контрольной точки конца последней кривой на координаты курсора мыши и, если последняя кривая не первая, изменяются координаты контрольной точки конца предпоследней кривой на координаты курсора мыши, противоположенные относительно конца предпоследней кривой.
- При движении курсора мыши с отпущенной ЛКМ меняются координаты конца и контрольной точки конца последней кривой.
- При очередном нажатии ЛКМ создаётся новая кривая Безье2 с началом в конце предыдущей, контрольной точкой начала на координатах, противоположенных координатам контрольной точки конца предыдущей кривой относительно её конца, и концом и контрольной точкой конца на координатах курсора мыши.
- После установки конца очередной кривой на расстоянии от начала первой кривой не более 10-ти пикселей координаты конца последней кривой становятся равными координатам начала первой кривой и координаты контрольной точки конца последней кривой становятся равными координатам точки, противоположенной координатам контрольной точки начала первой кривой относительно её начала, и рисование заканчивается.
- В случае установки конца очередной кривой на координатах её начала, последняя кривая удаляется и рисование заканчивается.
- При нажатии ЛКМ1 устанавливаются две точки, обозначающие противоположенные углы прямоугольника, в который будет вписан текст.
- При движении курсора мыши с зажатой ЛКМ перемещается вторая точка.
- При отпускании ЛКМ рисование заканчивается, запрашивается текст и создаётся текст выстой, равной высоте описанного прямоугольника, и с содержанием, включающим максимальное количество первых символов исходного текста, при которых ширина строки в пикселях не превышает ширину исходного прямоугольника.
- При нажатии ЛКМ1 объекту на координатах3 присваиваются новые параметры из панели параметров и инструментов: наличие заполнения, цвет заполнения, цвет контура и ширина контура.
- При нажатии ЛКМ1 объект на координатах3 удаляется.
- При движении курсора мыши с зажатой ЛКМ повторяется эффект нажатия ЛКМ.
- При нажатии ЛКМ1 объект на координатах3 привязывается к движениям курсора мыши и имеет равную ей дельту перемещения.
- При перемещении курсора мыши с зажатой ЛКМ1 объект на координатах3 совершает поворот относительно своего центра на угол, равный углу перемещения курсора мыши относительно центра объекта.
- После первого клика ЛКМ1 каждая точка объекта на координатах3 выделяется кружком синего цвета, а если объект является путём, то так же выделяются все контрольные точки с привязкой голубыми прямыми к соответствующим им началам и концам кривых.
- Каждая выделенная точка является перемещаемой курсором мыши.
- После первого клика ЛКМ1 объект на координатах3 выделяется голубым параллелограммом с синими кружками на углах и серединах его сторон.
- После перемещения одного из кружков масштаб объекта меняется с центром в точке, противоположенной перемещённой относительно центра объекта, и коэффициентом, равным отношению расстояния от противоположенной точки до перемещённой к расстоянию от противоположенной точки до проекции координат курсора мыши на прямую, соединяющую перемещённую точку с центром объекта.
- При нажатии ЛКМ1 по объекту на координатах3, если этот объект является путём, прямоугольником или эллипсом, он преобразуется в полилилнию с частотой изгибов, равной значению параметра ширины контура на панели параметров рисования.
- После первого клика ЛКМ1 объект на координатах3 выделяется голубым параллелограммом с синими кружками на углах и серединах его сторон.
- После перемещения кружка на ребре параллелограмма объект скашивается со статичным ребром, противоположенным схваченному, и изменяемому своё положение на холсте схваченному ребру.
- При перемещении кружка на углу параллелограмма создаётся искажение, подобное захвату двух кружков на центрах смежных углу рёбер.
- При первом нажатии ЛКМ1 устанавливаются два синих кружочка и голубая линия между ними.
- При движении курсора мыши с зажатой ЛКМ перемещается второй кружок.
- После отпускания ЛКМ мыши кружочки остаются перемещаемыми.
- При очередном нажатии ЛКМ объект на координатах3 отражается относительно прямой, отрисованной ранее.
- После первого клика ЛКМ1 объект на координатах3 выделяется голубым параллелограммом с синими кружками на углах и серединах его сторон.
- После перемещения одного из угловых кружков ширина и высота объекта изменяются в соответствии с отношением ширины и высоты прямой, соединяющей схваченный кружок с противоположенным ему относительно центра объекта, к прямой, соединяющей координаты курсора мыши с противоположенным кружком.
- В случае, если перемещён был кружок с горизонтальной грани, изменяется только высота объекта, а если вертикальной — ширина.
- Сочетание клавиш
ctrl
+z
отменяет последнее совершённое действие, если это возможно. - В свою очередь,
ctrl
+shift
+z
воспроизводит последнее отменённое действие, если такое существует. - Также для управления историей вы можете использовать кнопки:
History
->Undo
для отмены последнего действия иHistory
->Redo
для воспроизведения последнего отмененного действия. - История рисования линейна, поэтому после фиксации нового действия, если до этого были не воспроизведённые отменённые действия, они стираются.
- Взаимодействие со слоями происходит через специальную выпадающую панель (далее - панель слоёв), вызвать которую можно нажатием на кнопку в верхней правой части страницы.
- На панели слоёв будут отображаться все существующие слои, там же содержатся кнопки управления ими. Текущий активный слой (слой, на котором будет происходить рисование; далее - активный слой) выделяется оранжевым.
- Создание и удаление
- Осуществляются по нажатию на соответствующие кнопки в верхнем левом углу панели слоёв.
- Новый слой создается поверх старых и после создания автоматически становится активным.
- Удаляется активный слой, после чего активным становится слой ниже, если он есть.
- Перемещение
- Перемещать слои можно посредством перетаскивания их по панели слоёв.
- Ещё один способ - кнопки
up
иdown
в нижней части панели слоёв.
- Изменение прозрачности
- Отключение
- Копирование и слияние
- Кнопка
copy
копирует активный слой, располагая копию над ним. - Кнопка
merge with previous
объединит активный слой со слоем под ним (сохранив имя текущего слоя). - Кнопка
merge visible
объединит все видимые (т.е. не отключенные) слои в один (слой-слияние займет место последнего видимого слоя и получит его имя). - Кнопка
create layer from visible
создаст слой-слияние (с именемVisible
) всех видимых слоёв, не удаляя их, и расположит его поверх всех слоёв.
- Кнопка
Графический редактор позволяет открывать несколько файлов одновременно и удобно переключаться между ними.
- Под открытием файла подразумевается загрузка его содержимого с сервера на клиент с возможностью его последующего редактирования.
- Открытие нового файла происходит при первичной загрузке страницы редактора, создании нового файла или выборе уже существующего.
- Также при каждой такой загрузке внизу интерфейса редактора появляется соответствующий идентификатор файла.
- Идентификатор текущего активного файла подсвечивается синим, если вы хотите переключиться на другой файл, вам всего лишь нужно нажать на идентификатор интересующего вас файла.
- Для закрытия ненужного файла, необходимо нажать на крестик в правом нижнем углу его идентификатора.
- При этом новым активным файлом будет выбран первый открытый вами файл.
- Будьте аккуратны закрытие файла не сопровождается сохранением изменений, поэтому при закрытии несохраненного файла все изменения будут потеряны.
- Также если на странице редактора не останется открытых файлов, то автоматически произойдет переадресация на страницу аккаунта.
- При попытке открыть уже открытый файл редактор позволит вам это сделать, однако при этом будут утеряны все несохраненные изменения.
- При удалении с сервера открытого в редакторе файла, его идентификатор останется и с файлом можно будет продолжить работать и сохранить его снова.
- Для быстрого сохранения изменений в активном файле необходимо нажать
ctrl
+x
.
В окне редактора вам доступен следующий функционал работы с файлами.
- Чтобы создать новый файл, вам нужно выбрать в верхней панельке
File
->New
. - При этом откроется окошко, в котором надо будет ввести имя файла и выбрать соответствующий формат.
- При этом, если на сервере еще не существует файла с тем же именем, поле ввода имени будет подсвечиваться зеленым и кнопка
Ok
станет активной. - В противном случает кнопка не будет активной и поле ввода имени файла будет подсвечиваться красным цветом.
- При этом стоит помнить, что реальный файл на сервере не создается, но он будет создан после первого сохранения изменения в файле.
- Чтобы сохранить файл как, нужно выбрать
File
->Save as
, при этом откроется окошко в котором вы также должны выбрать имя и тип файла для сохранения. - Так же как и с созданием нового файла, подсветка подскажет вам доступное имя файла.
- Если у вас уже имеются файлы которые вы хотите отредактировать, вы можете загрузить их на сервер и открыть в редакторе.
- Для этого выберете
File
->Open
, при этом откроется окошко в котором при нажатии на кнопкуВыберете файл
, вы сможете выбрать файл, который загрузится на сервер, на своем компьютере. - Также если файл с таким именем уже существует на севере, то к имени загруженного файла будет в конце добавлено
(число)
.
- Чтобы открыть в редакторе хранящийся на сервер файл, выберите
Manage
->Edit
. - Откроется окошко в котором из предложенного списка нужно выбрать (нажать на) нужный файл, и, после нажатия кнопки
Ok
, выбранный файл появится в редакторе.
- Если вы наоборот хотите скачать файл с сервера на ваш компьютер, то выберите в верхнем меню
Manage
->Download
. - После чего у вас откроется окошко, в котором вы также из списка должны выбрать нужный файлы и нажать
Ok
, после чего файл будет скачан на ваш компьютер.
- Чтобы удалить ненужный файл или файлы, выберете
Manage
->Delete
. - Так же как и с открытием файла, ненужный файл нужно выбрать из списка и нажать
Ok
, после чего файл с сервера будет удален. - Также внизу окна можно выбрать (нажать)
Delete All
, что позволить после нажатияOk
, удалить все свои файлы, хранящиеся на сервере.
Редактор поддерживает два формата файлов svg
и yml
.
SVG
- это стандартный формат векторной графики. Он широко используем, поэтому вы можете открыть и использовать его почти в любых программах, поддерживающих векторную графику, и, конечно, в других редакторах.
Однако SVG
формат не очень хорошо подходит для глубокой работы со слоями.
Поэтому при использовании этого формата в нашем редакторе вы, конечно, сможете использовать функционал слоев, но при хранении файла вся работа со слоями не сохранится, и поэтому при повторном редактировании файла все созданные вами слои сольются в один.
Illustration - это наш собственный формат масштабируемой векторной графики с полноценной поддержкой слоев. Он основан на языке разметки yml
, и позволяет в полной мере реализовать работу со слоями.
Конечно, наш новый стандарт еще не принят ни в одной другой программе, поэтому вне этого редактора формат illustration пока бесполезен, хотя надеемся, что с ростом популярности эта ситуация исправится в будущем.
Но зато в самом редакторе с использованием данного формата при хранении будут сохраняться все созданные ранее слои.
И при повторном редактировании файла вы сможете работать с теми же слоями, с которыми работали раннее.
Разумеется, наш веб-редактор поддерживает полную конвертацию форматов, поэтому вы, например, можете создать и работать с файлами формата yml
, а перед загрузкой на свой компьютер просто сохранить как svg
и использовать в сторонних программах.
- Виленский Сергей Дмитриевич — тимлид и ведущий
frontend
разработчик — AngelicHedgehog - Фёдоров Владислав Павлович — дизайнер и
frontend
разработчик — GarryNeKasparov - Гасаев Гамид Казимович — ведущий
frontend
разработчик — wizardOfOz21 - Выдрина Варвара Алексеевна — дизайнер и
frontend
разработчик — vyydra - Сатыбалдиев Талгат — дизайнер и менеджер проекта — @SatybaldievT
- Кабанов Андрей Юрьевич — техлид, ведущий
full-stack
разработчик, администратор БД и сисадмин — Kabane-UN
- Посевин Данила Павлович — @posevin
Artem Nostrum — это пользовательский продукт с открытым исходным кодом, распространяемый под лицензией MIT License.
Огромная благодарность нашему куратору и просто очень хорошему человеку Посевину Даниле Павловичу. Большое спасибо за то, что направляли и вели наш проект, а также помогали решать все вопросы, касающиеся разработки. Пусть Ваш личный вклад не отображается на Github, но мы его очень ценим!
Footnotes
-
ЛКМ — аббревиатура от "левая клавиша мыши". ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
Объект на координатах — это объект, которому принадлежит точка с данными координатами, лежащий на активном слое и для которого не найдётся другого объекта на активном слое такого, что ему так же будет принадлежать данная точка и он будет находиться выше первого. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10