Разбор
TCAD Viewer
Просмотрщик 2D TCAD-структур: поля на сетке, разрезы и графики в одном окне
Задача
Результаты 2D TCAD — это кусок прибора на треугольной сетке: области материалов (кремний, оксид и т.д.), границы между ними и поля вроде концентрации или потенциала. Их нужно быстро открывать и смотреть без тяжёлых коммерческих программ.
В задании просили привычные форматы TCAD (STR, TIF, TDR и др.), клик по элементам сетки, цветовые шкалы, линии уровня, разрезы с графиками и всё это в одном окне с панелями, которые можно переставлять.
Файлы и сетка
Открывает 2D-структуры STR, TIF, MSH и одномерные данные TDR, PLX, CSV. Можно сохранить обратно в STR, TIF, MSH, TDR. Парсер сам собирает области, границы и значения на элементах — без лишних промежуточных форматов.
Spatial hash здесь — простая сетка ячеек поверх модели: каждый треугольник лежит в одной или нескольких ячейках. Клик или разрез смотрят только соседние ячейки, а не миллионы треугольников подряд. Без этого каждый клик был бы медленным.
- Импорт: STR, TIF, MSH
- 1D-данные: TDR, PLX, CSV
- Экспорт: STR, TIF, MSH, TDR
- Быстрый клик и разрез — сетка ячеек (spatial hash)
Отрисовка полей
Картинка поля рисуется на GPU (wgpu). Форма сетки лежит отдельно от значений: когда переключаешь концентрацию на потенциал, треугольники не собираются заново — обновляются только числа. Цвет считается на видеокарте; сглаживание (MSAA) можно менять на лету — для этого я патчил egui-wgpu (раздел ниже).
Линии уровня строятся по треугольникам параллельно (rayon). Есть режим «поверхность»: значение поля поднимает точки по высоте. Области материалов и границы рисуются поверх поля своими контурами.
- Сетка отдельно, значения поля — отдельно
- Цвет на GPU
- Патч egui-wgpu — смена сглаживания на лету
- Линии уровня и режим поверхности
Как я патчил egui-wgpu
В настройках TCAD Viewer можно включить или выключить сглаживание картинки — и окно не должно перезапускаться. В обычном egui-wgpu уровень сглаживания (MSAA: 1× или 4×) задаётся один раз при открытии окна; потом библиотека его уже не меняет.
Я скопировал исходники egui-wgpu в папку проекта и сказал Cargo брать эту копию вместо crates.io. В библиотеку добавил вызов «хочу такой-то MSAA»: он не ломает текущий кадр, а ставит отметку. В начале следующего кадра egui-wgpu сам пересобирает то, что нужно для нового сглаживания, и заново собирает только отрисовку интерфейса — шрифты и уже загруженные картинки UI не сбрасывает.
Со стороны TCAD Viewer порядок такой: обновить свой рендер под новый MSAA, пересобрать отрисовку сетки и поля, вызвать request_msaa. Ниже — готовый патч к egui-wgpu 0.34.2 с crates.io: можно скачать и наложить на чистые исходники.
- Проблема: в стоковой библиотеке MSAA только при старте
- Решение: своя копия egui-wgpu и смена на следующем кадре
- Шрифты и картинки UI при этом не перезагружаются
Как это выглядит в коде
// Settings: user picked MSAA 4×
egui_wgpu::request_msaa(4);
// Next frame inside egui-wgpu:
// rebuild MSAA buffers, keep UI textures
// TCAD Viewer also rebuilds its own
// mesh/field GPU pipelines for 4×
Разрезы и шкалы
Разрез — линия по структуре: вдоль неё снимаются значения и уходят в боковые 1D-графики (egui_plot с правками под TCAD). Можно держать несколько разрезов и сравнивать профили рядом.
Для графиков есть линейная шкала и логарифмические варианты, в том числе такие, что нормально ведут себя около нуля и при смене знака поля — это часто бывает у границ материалов. Шкалу можно сменить без повторной загрузки файла.
- Несколько разрезов с 1D-графиками
- Линейная и логарифмические шкалы
- Корректное поведение около нуля и смены знака
Чем сделано
Написано на Rust. Окно и панели — egui (eframe, egui_dock), графики — egui_plot с правками, отрисовка сетки и полей — wgpu. Тяжёлые расчёты по сетке идут параллельно через rayon. Раскладку панелей можно менять, она помнится в сессии.
Собран под задание по 2D-визуализации: форматы TCAD, инспекция на сетке и разрезы — без коммерческих просмотрщиков вроде INSPECT / SVisual.
- Rust · egui · egui_dock
- egui_plot (с правками) · wgpu
- rayon для расчётов по сетке
- Патч egui-wgpu — сглаживание на лету