В этом разделе описано, как добавить к картинке редактор для выделения областей при помощи инструментов HTML/JS/CSS. Вы также можете попробовать создать редактор для выделения областей в Конструкторе шаблонов.
Редактор дает возможность выделить область на картинке либо прямоугольником, либо произвольным многоугольником:
Поле для указания ссылки на картинку. Если вы храните картинки на Яндекс Диске, используйте тип строка, а не ссылка.
Поле polygon с типом json для передачи координат выделенной области.
В выходные данные тоже добавьте поле result с типом json. Поле для записи результатов обязательно для этого компонента. Если исполнитель поменяет выделенную область, туда будут записаны обновленные координаты.
Тип поля: image-annotation — редактор для выделения области на картинке.
да
нет
name
Атрибут для поля выходных данных. Содержит имя поля выходных данных.
да
нет
src
URL изображения. Варианты значений:
URL из входных данных задания. Например, из поля с идентификатором url: src=image.
Прямая ссылка. Рекомендуется использовать протокол HTTPS. Например: src="https://mywebsite.ru/img1.png".
Относительная ссылка. Если вы используете файлы с Яндекс Диска, укажите компонент proxy и название поля входных данных. Например, для поля с названием image запишите src=(proxy image). Измените тип поля на строку.
да
нет
annotations
Атрибут для поля входных данных. Содержит название поля входных данных. Сюда можно передавать координаты разметки для последующего редактирования. Формат данных — объект JSON.
нет
нет
Горячие клавиши
По умолчанию в задании будут работать горячие клавиши:
С закрывает многоугольник — соединяет линией первую и последнюю точки.
D удаляет выделенную точку, выделенный объект или последнюю точку при создании многоугольника.
Стрелки перемещают выделенную точку. При нажатой клавише Alt — медленнее. При нажатых клавишах Alt+Shift — быстрее.
Tab — переход от выделенной точки к следующей.
Shift+Tab — переход от выделенной точки к предыдущей.
Расскажите исполнителям о горячих клавишах в инструкции, чтобы ускорить выполнение задания.
Инструменты для выделения
По умолчанию в интерфейс задания будет добавлен один инструмент редактора — многоугольник.
Вы можете изменить набор инструментов:
Добавить прямоугольник
Скрыть многоугольник
Скрыть прямоугольник
Чтобы добавить прямоугольник, удалите CSS-селектор:
Чтобы использовать аннотации, вставьте в блок JS один из этих примеров:
Текстовое поле ввода
Выпадающий список
exports.Task = extend(TolokaHandlebarsTask, function (options) {
TolokaHandlebarsTask.call(this, options);
}, {
onRender: function() {
var field = this.getField('result');
var editor = field.getEditor();
editor.annotationInterface = field.createAnnotationInterface({
createInterfaceElement: function() {
this._input = document.createElement('input');
this._input.addEventListener('input', function() {
this._shape.annotation = this._input.value;
}.bind(this));
returnthis._input;
},
onShow: function(shape) {
this._shape = shape;
this._input.value = shape.annotation;
}
});
},
onDestroy: function() {
// Задание завершено, можно освобождать (если были использованы) глобальные ресурсы
}
});
functionextend(ParentClass, constructorFunction, prototypeHash) {
constructorFunction = constructorFunction || function () {};
prototypeHash = prototypeHash || {};
if (ParentClass) {
constructorFunction.prototype = Object.create(ParentClass.prototype);
}
for (var i in prototypeHash) {
constructorFunction.prototype[i] = prototypeHash[i];
}
return constructorFunction;
}
var listOption =
[["Животные","Кошка","Собака","Птичка"]];
var listValues =
[
["-","Cat","Dog","Bird"]
];
var bigListValues = [];
for(var i=0;i<listValues.length;i++){
for (var j=0;j<listValues[i].length;j++){
if(j != 0){
bigListValues[bigListValues.length] = listValues[i][j];
}
}
}
exports.Task = extend(TolokaHandlebarsTask, function (options) {
TolokaHandlebarsTask.call(this, options);
}, {
onRender: function() {
var field = this.getField('result');
var editor = field.getEditor();
editor.annotationInterface = field.createAnnotationInterface({
createInterfaceElement: function() {
this._select = document.createElement('select');
for(var j=0;j<listOption.length;j++){
var listGroup = listOption[j];
var valuesGroup = listValues[j];
var optgroup = document.createElement("optgroup");
optgroup.setAttribute('label', listGroup[0]);
for (var i = 1; i < listGroup.length; i++) {
var option = document.createElement("option");
if (i == 0) {
option.setAttribute('disabled', 'disabled');
}
option.value = valuesGroup[i];
option.className = "seletOpt";
var oText = document.createTextNode(listGroup[i]);
option.appendChild(oText);
optgroup.appendChild(option);
}
this._select.appendChild(optgroup);
}
this._select.addEventListener('change', function() {
this._shape.annotation = this._select.value;
_.each(bigListValues, function(value) {
this._polygonEl.classList.remove(value.toLowerCase());
}.bind(this));
this._polygonEl.classList.add(this._select.value.toLowerCase());
}.bind(this));
returnthis._select;
},
onShow: function(shape, el) {
console.log("shape: ", shape)
console.log("el: ", el)
this._shape = shape;
this._select.value = shape.annotation;
this._polygonEl = el;
}
});
},
onDestroy: function() {
// Задание завершено, можно освобождать (если были использованы) глобальные ресурсы
}
});
functionextend(ParentClass, constructorFunction, prototypeHash) {
constructorFunction = constructorFunction || function () {};
prototypeHash = prototypeHash || {};
if (ParentClass) {
constructorFunction.prototype = Object.create(ParentClass.prototype);
}
for (var i in prototypeHash) {
constructorFunction.prototype[i] = prototypeHash[i];
}
return constructorFunction;
}
Объяснение примеров
Чтобы исполнитель мог ввести аннотацию к выделенной области или выбрать ее из списка, в задание нужно добавить элемент интерфейса (например, текстовое поле, выпадающий список):
Получите объект редактора getEditor() и интерфейса для аннотаций getField('result') в методе onRender():
var field = this.getField('result');
var editor = field.getEditor();
Установите реализацию интерфейса для аннотаций в методах:
createInterfaceElement() — вызывает DOM-элемент интерфейса (вызывается один раз при инициализации).
onShow(shape, options) — отображает интерфейс для аннотаций, когда исполнитель наводит мышку на выделенную область. Получает на вход JSON с координатами точек многоугольника. В этот JSON можно записать аннотацию, которую ввел исполнитель.
Взаимодействие исполнителя с редактором вызывает следующие события:
shape:start — начало выделения области.
shape:finish — завершение выделения.
shape:cancel — удаление точки.
shape:remove — удаление выделения.
Подписаться на эти события можно так:
editor.on('shape:start', function() {
/* обработка события */
});