Console API

Руководство по взаимодействию с Редактором изделий через консоль браузера

Быстрый старт

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

  1. Откройте консоль браузера
    Нажмите F12 (или Ctrl+Shift+J) и перейдите на вкладку Console.
  2. Получите проект
    const project = getProjectDataService().getProject();
  3. Найдите нужный компонент
    const comp = project.components[0];
    console.log(comp.name, comp.guid);
  4. Измените свойство через diff
    generateAndApplyFieldDiff(
      'component', comp.guid,
      'position.x',
      comp.position.x,       // старое значение
      comp.position.x + 100  // новое значение
    );
Важно

Все изменения данных проекта должны проходить через функции generateAndApplyFieldDiff или generateAndApplyMultiFieldDiff. Прямая мутация объектов (comp.position.x = 100) не обновит 3D-сцену и не попадёт в историю отмен.

Как открыть консоль

БраузерГорячая клавиша
Chrome / EdgeF12 или Ctrl + Shift + J
FirefoxF12 или Ctrl + Shift + K
SafariCmd + Option + C (включите «Меню разработки» в настройках)

После открытия DevTools перейдите на вкладку Console. Именно в ней вводятся все команды из этого руководства.

Получение проекта

const project = getProjectDataService().getProject();

Возвращает текущий объект проекта. Из него доступны все коллекции:

СвойствоТипОписание
project.componentsМассивВсе компоненты (детали) проекта
project.virtual_objectsМассивВиртуальные объекты
project.connection_pointsМассивТочки соединения
project.graphОбъектПараметрический граф проекта
project.guidСтрокаУникальный идентификатор проекта

Просмотр компонентов

Список всех компонентов

const project = getProjectDataService().getProject();

// Вывести имя, guid и позицию каждого компонента
project.components.forEach((c, i) => {
  console.log(
    `[${i}] ${c.name}`,
    `guid: ${c.guid}`,
    `pos: (${c.position.x}, ${c.position.y}, ${c.position.z})`
  );
});

Удобная таблица

console.table(
  project.components.map(c => ({
    name: c.name,
    guid: c.guid.slice(0, 8) + '…',
    x: c.position.x,
    y: c.position.y,
    z: c.position.z,
    sizeX: c.size.x,
    sizeY: c.size.y,
    sizeZ: c.size.z,
    type: c.modifier.type,
    active: c.is_active,
  }))
);

Поиск компонента

По имени

const comp = project.components.find(c => c.name === 'Столешница');

По части имени

const panels = project.components.filter(c => c.name.includes('Боковина'));

По типу модификатора

// Все ЛДСП-компоненты
const ldsp = project.components.filter(c => c.modifier.type === 'LDSP');

По GUID

const comp = project.components.find(c => c.guid === 'ваш-guid-здесь');

Изменение одного поля

Функция generateAndApplyFieldDiff — основной инструмент для изменения любого свойства сущности.

generateAndApplyFieldDiff(
  entityType: string,
  entityGuid: string,
  fieldPath: string,
  oldValue: any,
  newValue: any
)
ПараметрОписание
entityTypeТип сущности: 'component', 'virtualObject', 'project' и др.
entityGuidGUID сущности (берётся из comp.guid)
fieldPathПуть к полю через точку, например 'position.x', 'modifier.cut_angle1'
oldValueТекущее значение поля (необходимо для корректной работы Undo)
newValueНовое значение

Пример: переименовать компонент

const comp = project.components[0];

generateAndApplyFieldDiff(
  'component', comp.guid,
  'name',
  comp.name,           // старое имя
  'Новое название'    // новое имя
);

Пример: сдвинуть по оси X на 100 мм

generateAndApplyFieldDiff(
  'component', comp.guid,
  'position.x',
  comp.position.x,
  comp.position.x + 100
);

Изменение нескольких полей

Функция generateAndApplyMultiFieldDiff — для атомарного изменения нескольких полей одной сущности за раз. Все поля попадают в один diff и в одну запись Undo.

generateAndApplyMultiFieldDiff(
  entityType: string,
  entityGuid: string,
  changes: Array<{ path, oldValue, newValue }>
)

Пример: переместить компонент в точку (200, 150, 50)

const comp = getProjectDataService().getProject().components[0];

generateAndApplyMultiFieldDiff('component', comp.guid, [
  { path: 'position.x', oldValue: comp.position.x, newValue: 200 },
  { path: 'position.y', oldValue: comp.position.y, newValue: 150 },
  { path: 'position.z', oldValue: comp.position.z, newValue: 50  },
]);

Позиция и размер

Сдвинуть компонент

const comp = project.components.find(c => c.name === 'Столешница');

// Сдвиг по Y на 50мм вверх
generateAndApplyFieldDiff(
  'component', comp.guid,
  'position.y',
  comp.position.y,
  comp.position.y + 50
);

Изменить размер

// Задать ширину (X) = 600мм
generateAndApplyFieldDiff(
  'component', comp.guid,
  'size.x',
  comp.size.x,
  600
);

Изменить размер по всем осям

generateAndApplyMultiFieldDiff('component', comp.guid, [
  { path: 'size.x', oldValue: comp.size.x, newValue: 600 },
  { path: 'size.y', oldValue: comp.size.y, newValue: 400 },
  { path: 'size.z', oldValue: comp.size.z, newValue: 16  },
]);
Оси координат

X — ширина, Y — высота, Z — глубина (толщина). Единицы измерения — миллиметры.

Свойства модификатора

Свойства модификатора доступны по пути modifier.<поле>. Набор полей зависит от типа компонента.

ЛДСП — углы отреза

const comp = project.components.find(c => c.modifier.type === 'LDSP');

// Задать угол отреза 45°
generateAndApplyFieldDiff(
  'component', comp.guid,
  'modifier.cut_angle1',
  comp.modifier.cut_angle1,
  45
);

Основные поля модификаторов по типам

ТипПоля модификатора
LDSP cut_angle1, cut_angle2, back_material, edges, real_size
MESH mesh, node_name, use_scale, apply_offset, mesh_size, mesh_offset
BUILTIN related_project, show_inputs, target_slot, allow_iik_slotting, margins
PANEL center_depth, shape
Как узнать доступные поля?

Введите в консоли console.log(comp.modifier) — браузер покажет объект целиком со всеми его полями и текущими значениями.

Видимость компонента

// Скрыть компонент
generateAndApplyFieldDiff(
  'component', comp.guid,
  'is_active',
  true,
  false
);
// Показать компонент
generateAndApplyFieldDiff(
  'component', comp.guid,
  'is_active',
  false,
  true
);

Входы графа

Параметрический граф проекта позволяет управлять изделием через входные параметры (ширина, высота, количество полок и т.д.).

Просмотр входов

const project = getProjectDataService().getProject();

console.table(
  project.graph.inputs.map(inp => ({
    name: inp.name,
    label: inp.verbose_ru,
    value: inp.value,
    type: inp.type,
    active: inp.is_active,
  }))
);

Изменение значения входа

const inp = project.graph.inputs.find(i => i.name === 'width');

generateAndApplyFieldDiff(
  'graphInput', inp.guid,
  'value',
  inp.value,
  800
);

Пересчёт графа

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

await getProjectDataService().recalculateGraph('width', 800);
Async/Await

recalculateGraph — асинхронная функция. Используйте await в консоли (в современных браузерах это работает по умолчанию). Функция возвращает true при успешном пересчёте.

Пакетные операции: сдвиг

Сдвинуть все компоненты по Y на 100мм

const project = getProjectDataService().getProject();

project.components.forEach(comp => {
  generateAndApplyFieldDiff(
    'component', comp.guid,
    'position.y',
    comp.position.y,
    comp.position.y + 100
  );
});
Undo пакетных операций

Каждый вызов generateAndApplyFieldDiff создаёт отдельную запись в истории отмен. Для пакетной операции над N компонентами потребуется N нажатий Ctrl+Z для отмены.

Пакетные операции: переименование

Добавить префикс к именам

project.components.forEach(comp => {
  generateAndApplyFieldDiff(
    'component', comp.guid,
    'name',
    comp.name,
    'Шкаф_' + comp.name
  );
});

Пронумеровать компоненты

project.components.forEach((comp, i) => {
  generateAndApplyFieldDiff(
    'component', comp.guid,
    'name',
    comp.name,
    `Деталь_${i + 1}`
  );
});

Пакетные операции: замена материала

Заменить материал всем ЛДСП-компонентам

const ldspParts = project.components.filter(c => c.modifier.type === 'LDSP');

ldspParts.forEach(comp => {
  generateAndApplyFieldDiff(
    'component', comp.guid,
    'material',
    comp.material,
    'путь/к/новому/материалу'
  );
});
Как узнать путь материала?

Посмотрите текущий материал любого компонента: console.log(comp.material). Путь к материалу — это строка в формате S123Path, например "catalogs/materials/ldsp/egger/h3342".

ProjectDataService

Сервис Доступ к данным проекта и ядру IIK.

const pds = getProjectDataService();
МетодОписание
getProject()Возвращает текущий объект проекта
getIIKCore()Возвращает экземпляр ядра IIKCore
getCurrentProjectGuid()GUID текущего проекта
getLastDiff()Последний diff после Calculate()
enableDiffCollection()Включить сбор diff'ов в IIKCore
disableDiffCollection()Выключить сбор diff'ов
recalculateGraph(name, value)Пересчитать граф с новым значением входа
assemble()Запустить сборку проекта

DiffService

Сервис Центральный хаб для всех изменений в проекте.

const ds = getDiffService();

Подписка на изменения

// Логировать все изменения в проекте
const unsub = getDiffService().onDiffApplied((event) => {
  console.log('Diff:', event.type, event.diff);
});

// Чтобы отписаться:
unsub();

DiffType

ЗначениеОписание
DiffType.ImmediateЛокальное изменение — записывается в историю, отправляется в CRDT
DiffType.PreviewВременное — только визуальное обновление, без истории
DiffType.RemoteУдалённое — от другого пользователя

SceneService

Сервис Управление 3D-сценой (Three.js).

const scene = getSceneService();

Используется в основном для отладки рендеринга. Через него можно получить доступ к Three.js-объектам сцены.

Управление логами

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

КомандаОписание
enableLog('SceneService')Включить логи конкретного модуля
enableLog('*')Включить логи всех модулей
disableLog('SceneService')Выключить логи модуля
disableAllLogs()Выключить все логи
getLogStatus()Показать включённые модули
getAvailableModules()Список всех доступных модулей
clearLogs()Сбросить конфигурацию логов

Пример: отладка DiffService

enableLog('DiffService');

// Теперь каждое применение diff будет логироваться в консоль.
// Чтобы выключить:
disableLog('DiffService');
Настройки сохраняются

Включённые модули логирования сохраняются в localStorage и переживают перезагрузку страницы. Используйте clearLogs() для полного сброса.

Справочник: все функции

ФункцияОписание
getProjectDataService()Получить сервис данных проекта
getDiffService()Получить сервис diff'ов
getSceneService()Получить сервис 3D-сцены
DiffTypeEnum типов diff: Immediate, Preview, Remote
generateAndApplyFieldDiff(type, guid, path, old, new)Изменить одно поле сущности
generateAndApplyMultiFieldDiff(type, guid, changes)Изменить несколько полей сущности
enableLog(module)Включить логирование модуля
disableLog(module)Выключить логирование модуля
disableAllLogs()Выключить все логи
getLogStatus()Показать включённые логи
getAvailableModules()Список всех модулей логирования
clearLogs()Сбросить конфигурацию логирования

Справочник: типы сущностей

Первый параметр функций generateAndApplyFieldDiff / generateAndApplyMultiFieldDiff.

entityTypeОписаниеГде найти
'component'Компонент (деталь)project.components[i]
'virtualObject'Виртуальный объектproject.virtual_objects[i]
'connectionPoint'Точка соединенияproject.connection_points[i]
'positioningPoint'Точка позиционированияcomp.positioning_points[i]
'graphInput'Вход графаproject.graph.inputs[i]
'graphOutput'Выход графаproject.graph.outputs[i]
'graphNode'Нода графаproject.graph.nodes[i]
'project'Сам проектproject

Справочник: поля компонента

Используются как fieldPath в функциях изменения.

Путь поляТипОписание
namestringНазвание компонента
position.xnumberПозиция по X (мм)
position.ynumberПозиция по Y (мм)
position.znumberПозиция по Z (мм)
size.xnumberРазмер по X — ширина (мм)
size.ynumberРазмер по Y — высота (мм)
size.znumberРазмер по Z — глубина (мм)
rotation.xnumberВращение (кватернион X)
rotation.ynumberВращение (кватернион Y)
rotation.znumberВращение (кватернион Z)
rotation.wnumberВращение (кватернион W)
materialstringПуть к материалу (S123Path)
colorobjectЦвет компонента
is_activebooleanВидимость (true — видим)
descriptionstringОписание
build_ordernumberПорядок сборки
ordernumberПорядок в списке
modifier.cut_angle1numberУгол отреза 1 (ЛДСП)
modifier.cut_angle2numberУгол отреза 2 (ЛДСП)
modifier.back_materialstringМатериал задней стенки (ЛДСП)
modifier.center_depthnumberГлубина центра (Панель)
modifier.meshstringФайл меша (Mesh)
modifier.related_projectstringСвязанный проект (BuiltIn)

Справочник: DiffType

ЗначениеКонстантаИсторияCRDTСцена
'immediate' DiffType.Immediate Да Да Да
'preview' DiffType.Preview Нет Нет Да
'remote' DiffType.Remote Да Нет Да
Готово!

Все функции generateAndApplyFieldDiff и generateAndApplyMultiFieldDiff используют DiffType.Immediate по умолчанию. Это значит, что ваши изменения автоматически попадут в историю отмен и будут синхронизированы с другими пользователями.