Как визуализировать блок в Blockly?

Я просмотрел документацию Workspace и попытался использовать метод newBlock следующим образом:

var block = workspace.newBlock("string_length"), чтобы добавить пользовательский блок, который определяется следующим образом:

Blockly.Blocks['string_length'] = {
  init: function() {
    this.jsonInit({
      "message0": 'length of %1',
      "args0": [
        {
          "type": "input_value",
          "name": "VALUE",
          "check": "String"
        }
      ],
      "output": "Number",
      "colour": 160,
      "tooltip": "Returns number of letters in the provided text.",
      "helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"
    });
  }
};

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

Блок оказался не виден даже после попытки добавить его в топблоки.


person Lloyd    schedule 21.05.2019    source источник
comment
Почему вы разместили вопрос только для того, чтобы сразу же ответить на него?   -  person Kobe    schedule 21.05.2019
comment
О, хорошо, спасибо, что указали на это.   -  person Kobe    schedule 21.05.2019


Ответы (1)


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

Убедитесь, что блок был добавлен правильно, то есть block = workspace.newBlock("your_type") не выдает ошибку, а блок инициализирован.

Затем вам нужно вызвать функцию block.initSvg(), в документации сказано, что вы должны вызвать либо функцию initSvg(), либо функцию initModel():

Вызовите initModel для всех полей в блоке. Может вызываться более одного раза. Либо initModel, либо initSvg необходимо вызывать после создания блока и перед первым взаимодействием с ним. Взаимодействия включают действия пользовательского интерфейса (например, нажатие и перетаскивание) и запуск событий (например, создание, удаление и изменение).

Но функция initModel(), кажется, дает мне ту же ошибку, что и когда я еще не инициализировал ее, документация, насколько я вижу, также не дает четкого различия между ними.

После вызова функции initSvg() вы сможете визуализировать требуемый блок, вызвав .render() для вашего объекта workspace.

источники:

Блокировать документацию

Документация по рабочей области

person Lloyd    schedule 21.05.2019