Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Новые классы в рисовалке (Скелетон) #566

Open
unpete opened this issue May 1, 2020 · 2 comments
Open

Новые классы в рисовалке (Скелетон) #566

unpete opened this issue May 1, 2020 · 2 comments

Comments

@unpete
Copy link
Member

unpete commented May 1, 2020

Графический движок неплохо справляется с построением сложных изделий - подтверждено практикой на больших масштабах. Вместе с тем, выявлены недостатки объектной модели:

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

  • Плохая устойчивость изделия к деформациям, неочевидное для пользователей поведение при сдвигах узлов и элементов
  • Высокие затраты процессорного времени для расчета координат и путей
  • Плохая структура кода и невнятный жизненный цикл BuilderElement, при котором смешаны пересчет и отрисовка

Решено, дополнить класс Scheme свойством Skeleton, содержащим Nodes (семейство узлов изделия) и Ribs (семейство рёбер, как основу профилей и заполнений).
Скелетон сможет с высокой скоростью обрабатывать запросы о положении, примыкании и пересечении элементов и безопасно выполнять команды деформации.

Три зайца окажутся убитыми наповал:

  • На больших витражах, ожидается рост скорости рендеринга на два порядка (10ms вместо сегодняшней секунды)
  • Исключены отрывы узлов, перескоки створок и прочие чудеса при деформациях изделия
  • Заработает undo-redo, т.к. команды на деформацию примут явный вид, их можно будет запомнить в history и путешествовать во времени
@unpete
Copy link
Member Author

unpete commented Jun 24, 2020

Ключевые изменения в жизненном цикле элементов построителя:

  • Убираем redraw() из requestAnimationFrame Scheme
    • при загрузке из шаблона или ранее сохраненного изделия, элементы сами добавят себя в скелетон и слой
    • команды редактирования, в том числе, изменение параметров, обрабатываем явно, следить за ними из redraw() не нужно
  • Убираем поиск и автопересчет соединений на концах профиля. За это отвечает скелетон и соединения не могут измениться без его ведома
  • Убираем поиск и автопересчет заполнений из слоёв

@unpete unpete changed the title Новые классы в рисовалке Новые классы в рисовалке (Скелетон) Jun 24, 2020
@unpete
Copy link
Member Author

unpete commented Jul 22, 2020

move_points

Сейчас, метод move_points() есть у проекта и профиля. Его вызывает либо инструмент select_node, когда человек тянет мышью узлы и элементы, либо DimensionLine при изменении размеров. Так же, метод могут вызывать внешние скрипты при невизуальном редактировании.
Очевидно, что метод move_points() должен появиться и у скелетона, но его поведение и визуализация будут несколько иными:

  • move_points() скелетона не изменяет проект и фактически, узлы не двигает. Метод лишь оценивает, можно ли сдвинуть узлы в заданную точку и возвращает дельту сдвига с учетом ограничений графа
  • При интерактивных сдвигах, скелетон рисует упрощенную визуализацию, а фактический сдвиг происходит по событию mouseup, если изменение инициировано инструментом или при ненулевой дельте, если инициатор - размерная линия

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant