AutoCAD у браузері на Angular: як я створюю KulmanLab і чому DXF — це 80% мого болю
Привіт, DOU! Мене звати Володимир, і я належу до тих розробників, які не просто змінили професію, а конвертували свій попередній досвід у код. Сьогодні я — Java Backend Developer. У моєму дипломі написано «Інженер-будівельник», і роки, проведені за кресленнями на «домашніх» кульманах та в AutoCAD, зрештою вилилися у власний хобі-проєкт — KulmanLab.com.
Від цивільної інженерії до саморобного CNC
Мій шлях в IT розпочався, коли я усвідомив: робота інженера-будівельника — це нескінченна рутина типових задач, що вимагає колосальної відповідальності. Матеріальна компенсація — то взагалі окрема історія. На останньому курсі я почав вивчати Java і майже за рік отримав першу омріяну роботу backend-розробника.
Проте інженерна жилка нікуди не зникла. Я захопився CNC-верстатами й навіть зібрав власний на базі контролера Ruida. Підійшов до справи з максималізмом: обрав потужну CO2-трубку, через що і весь верстат вийшов доволі габаритним.


Кожен, хто стикався з лазерною різкою чи фрезеруванням, знає цей біль: шлях від ідеї до готового виробу часто пролягає через «монструозний» софт. Вам потрібно або купувати дорогу ліцензію на AutoCAD/SolidWorks, або страждати з безкоштовними аналогами, що мають жахливий UX. Я поставив собі за мету створити інструмент, який відкривається за секунду, не вимагає реєстрації та дозволяє підготувати файл для верстата просто у браузері.
Філософія проєкту: Сила статичних сторінок та IndexedDB
Головний принцип KulmanLab — максимальна автономність. Проєкт хоститься на Firebase і працює як чиста статична сторінка.
Чому без бекенду?
- Privacy-first: ваші креслення — це ваша власність. Вони не зберігаються на моєму сервері й не передаються мережею. Уся обробка відбувається локально.
- Zero cost maintenance: відсутність серверної логіки дозволяє проєкту існувати без рекламних банерів та підписок. Єдині витрати стосуються купівлі домену.
- Offline-first: за допомогою IndexedDB я реалізував систему автозбереження. Навіть якщо ви випадково закриєте браузер або зникне світло, файли та вся історія змін залишаються в локальному сховищі. Це ваша персональна «хмара» на місці. Щойно ви відкриваєте новий DXF-файл або створюєте проєкт із нуля — робота починається миттєво, а доступ до всіх попередніх файлів зберігається в будь-який момент.
Щоб не вигадувати UX з нуля, я обрав AutoCAD-стиль: команди можна викликати за допомогою клавіатури, а підказки відображаються в терміналі внизу сторінки. Такий підхід може здатися не надто інтуїтивним для новачків, але він значно пришвидшує роботу, адже відпадає потреба щоразу шукати потрібну кнопку на панелі інструментів. З проектом можна ознайомитися kulmanlab.com або просто переглянувши GIF:

Технічний челендж: Геометрія та перформанс
Три роки тому, коли я тільки починав, мене захопили прикладні геометричні задачі: як знайти точку перетину двох ліній, лінії та еліпса тощо. Я шукав математичні фунції фігур, виводив системи рівнянь і реалізовував це в коді. Можливість одразу бачити результат обчислень на фронтенді неймовірно драйвила. Мабуть, це було те, що мені бракувало як backend розробнику.
Для розробки я обрав зв’язку Canvas + Angular. Чому саме Angular? Я був і є далеким від мейнстримного фронтенд-стеку. Мій бекенд-бекграунд підказував, що TypeScript візуально близький до Java, а компонентний підхід Angular дозволяє легко ізолювати кожну «кнопку-команду». Двостороннє зв’язування (bidirectional binding) значно спростило відображення змін під час редагування елементів. Знаю, що такий «грубий» вибір стеку може викликати дискусії, але тоді я витратив на це рішення лише 20 хвилин і одразу перейшов до справи. Найбільше я боявся застрягнути на етапі пошуку «ідеального інструменту» і втратити запал. На щастя, ось уже 3 роки я витрачаю по декілька годин на тиждень і зберігаю високий інтерес до свого хобі.
На старті я очікував, що можливості браузера швидко стануть вузьким місцем (bottleneck). Адже коли на екрані багато об’єктів (ліній, дуг, сплайнів), усе має працювати плавно. Проте виявилося, що простір для оптимізації — практично безмежний. Зараз я переконаний: ноутбук середньої потужності цілком може «перетравлювати» до 1 мільйона елементів без критичних фризів. Після серії базових оптимізацій вже зараз можна працювати з 100 000 обєктів.
Найцікавіший виклик — це Grips (точки керування) та Snapping (об’єктні прив’язки). У такому софті не можна вказати точку «приблизно» — система має миттєво знаходити центр кола, крайню точку сплайна або перетин ліній. Щоб це працювало швидко на великих проєктах, я впровадив просторове індексування. Замість перебору всіх 100 000 об’єктів при кожному русі миші, система шукає у відсортованих масивах за X та Y координатами. Це дозволяє стабільно тримати 60 FPS навіть на складних кресленнях.
Для аналітики я використовую Google Analytics із кастомними подіями. Це дозволяє розуміти, які інструменти популярні, не порушуючи приватності вмісту самих файлів користувачів.
DXF: Формат, що прийшов із пекла
Багато хто вважає, що розпарсити DXF — це і є головна проблема. Насправді це найпростіша частина. Справжнє пекло починається на етапі експорту: коли потрібно зібрати валідний файл, який без помилок прочитає AutoCAD або примхливий контролер CNC-верстата.
Нижче — шматок валідного файлу. Формат складається із записів key-value, де кожен елемент займає окремий рядок. Наприклад, ключ 4, значення — пусте, далі ключ 1001 і значення AcadAnnotative.
0
STYLE
5
DC
330
3
100
AcDbSymbolTableRecord
100
AcDbTextStyleTableRecord
2
Annotative
70
0
40
0.0
41
1.0
50
0.0
71
0
42
0.2
3
arial.ttf
41001
AcadAnnotative
1000
AnnotativeData
1002
{
1070
1
1070
1
1002
}
Як бачите, в Autodesk не бачать жодних проблем у дублюванні однакових ключів для одного об’єкта, а порожні рядки як значення — це взагалі «стандарт». Порядок записів — важливий, але не завжди:) Формат виглядає максимально хаотичним і непередбачуваним.
Чому це складно? Головна підступність DXF — у так званих групових кодах. Один і той самий код може означати координату X для лінії, радіус для кола або назву шару, залежно від контексту та секції. До того ж AutoCAD надзвичайно чутливий до порядку цих кодів. Варто переплутати послідовність запису параметрів у секції HEADER або TABLES — і файл перетворюється на сміття, яке не відкриє жоден редактор.
Ще один виклик — підтримка Splines (сплайнів). Якщо звичайна лінія описується двома точками, то сплайни потребують контрольних точок (CV), вузлів (knots) та ваг. Документація Autodesk описує це лише поверхнево, а на практиці доводиться «реверс-інжинірити» файли, створені в AutoCAD, щоб зрозуміти, чому ваш сплайн у браузері виглядає ідеально, а після експорту перетворюється на хаотичну криву.
Можливості KulmanLab сьогодні: від MVP до робочого інструменту
Що вже працює:
- Повна підтримка 2D-примітивів: лінійні відрізки, кола, дуги, еліпси та полілінії. Недостатню увагу приділено тексту, адже коректне відображення шрифтів у CAD-системах — це окремий квест. Працюватиму над цим в майбутньому.
- Складні сплайни: це була моя маленька перемога. Я реалізував два режими побудови кривих — Fit (проходження чітко через задані точки) та Control Vertex (CV) (керування кривою за допомогою контрольного полігона). Це критично важливо для моделювання складних контурів під лазерну різку.
- Інструменти трансформації: класичний набір, без якого неможливе проектування — Move, Copy, Scale, Mirror та Rotate. Усі вони працюють з урахуванням об’єктних прив’язок.
- Структурування проєкту: реалізовано повноцінну роботу з шарами (Layers). Ви можете керувати видимістю, кольорами та типами ліній, що дозволяє працювати зі складними кресленнями, де потрібно відокремити контури різу від ліній гравіювання.
- Точність та аналітика: система автоматично знаходить точки перетину об’єктів та дозволяє проводити прецизійне масштабування — базові речі для підготовки креслення до виробництва.
Що далі? (Roadmap) Проєкт розвивається паралельно з моєю основною роботою, тож плани амбітні:
- Вдосконалення Snapping: зробити об’єктні прив’язки ще більш «розумними» та швидкими (зокрема, додати полярне відстеження).
- Розширення функціоналу: додавання інструментів для проставлення розмірів (Dimensions) та виноски (Leaders).
- Експорт у PDF: хоча основний фокус — це DXF для виробництва, можливість швидко зберегти креслення в PDF для друку чи звіту є критично необхідною.
- Покращення UX: я постійно аналізую кастомні події з Google Analytics, щоб зрозуміти, де користувачі «спотикаються», і зробити інтерфейс зручнішим.
Головні юзкейси: Для кого і навіщо?
KulmanLab не намагається вбити AutoCAD. Моя мета — створити швидкий «швейцарський ніж» для тих, кому потрібно виконати конкретну задачу тут і зараз, без очікування, поки завантажиться важка IDE для креслення.
Я бачу два основних напрямки використання:
- CNC-спільнота та лазерна різка: Це майстри та ентузіасти, яким потрібно швидко відкрити DXF-файл, перевірити габарити, підправити контур або видалити зайві елементи перед відправкою на верстат.
- Студенти та технічна освіта: Уявіть ситуацію: потрібно швидко накидати інженерну схему для курсової чи лабораторної роботи. Замість того, щоб шукати «крякнутий» софт чи отримувати навчальну ліцензію на один семестр, студент може зайти в браузер, створити схему й одразу експортувати її у форматі PNG/JPEG високої роздільної здатності. Це значно швидше та простіше.
Чому це зручно?
- Zero-latency: Ви відкриваєте сайт і за секунду вже працюєте.
- Універсальність експорту: Крім «сирого» DXF, ви отримуєте чітке графічне зображення для вставки в текстові документи (Word/Google Docs).
- Відсутність бар’єрів: Не потрібно реєструватися, підтверджувати пошту чи прив’язувати карту.
AI як каталізатор та погляд у майбутнє
Розробка KulmanLab триває вже три роки, але саме останні пів року стали вирішальними. Поява потужних AI-асистентів дозволила мені значно пришвидшити розробку. Для соло-розробника це стало справжнім «підсилювачем», який перетворив затяжний процес на стрімкий шлях до релізу.
У планах ще багато роботи:
- Впровадження інструментів для проставлення розмірів (Dimensions) та виносних написів.
- Розширення бібліотеки стандартних елементів.
- Покращення роботи привязок.
- Підтримка додаткових форматів (SVG/PDF) .
Я вірю, що надмірна універсальність — це шлях до компромісів, які роблять софт перевантаженим і незручним. Тому KulmanLab залишається вірним своїй ідеї: тільки 2D, тільки швидкість, тільки браузер. Жодної обов’язкової реєстрації, жодних рекламних банерів — лише чистий інструмент для роботи.
Спробувати інструмент: kulmanlab.com
Буду радий почути фідбек від колег-розробників та інженерів у коментарях! Чи стикалися ви з DXF у своїх проєктах? Які інструменти використовуєте для швидкого редагування креслень?
15 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівА я інтегрував claude code до sketchup через mcp і пишу просто АІ що треба змоделювати. Для чогось складного поки не годиться але я думаю що за цим майбутнє бо я не хочу годинами моделювати мишкою
www.linkedin.com/...Jreo7VkS2hdYvtf3We_Txouj4
Теж цікавлюсь даною темою та робив щось типу стартапу. Але було цікаво більше виготовлення кінцевої продукції, а редактор був в дуже далеких планах, тож для створення моделі юзав Inkscape. Був веб інтерфейс але тільки для перегляду креслення, робив його на реакті. Базовим форматом був SVG, DXF взагалі не розглядав, бо вважав його незрозумілим та пережитком минулого. Для гіпотетичних юзеров пропонував документацію, як створити креслення.
Як та чи інша фігура з SVG буде вирізатися, визначалося у полі «desc» цієї фігури. Якщо треба було якесь 3D, прив’язував його до конкретної фігури (як depthmap у картинці або процедурне у додатковому скрипті). Також можна було вирізати край фігури профілем, який задавався іншою фігурою.
Майже все що тут www.youtube.com/@arttechwood/videos зроблено даним софтом.
Досі цікавлюсь цією темою, думаю чи має сенс відновити проєкт у якомусь вигляді. А тепер ще й ШІ може допомагати робити моделі та сам софт також. Якщо автору цікаво, можу трохи прийняти участь, поки маю трохи вільних годин на тиждень.
багато хто вже написав про wasm — забудьте про js взагалі і усі ці каряві ліби на ньому. пишіть на улюбленій мові, юзайте продакшен реді ліби. Наприклад C/C++, Rust, Go, Kotlin досить легко компілюються у wasm. Як би у вас був проєкт де багато роботи з dom то, да, я би радив wasm точково, де багато обчислювань, великі дані, а у вас чисто канва — то весь проєкт прям треба пиляти на wasm
Чому ви не візьмете готовий моделлер OpenCASCADE наприклад, як це робить той же FreeCAD ?
Це звісно питання з розряду «Для чого ще один сорт пива?», та в чому перевага рішення при наявності самого Autodesk Fusion 360 ?
OpenCASCADE це скоріше 3D бібліотека.
Для dxf:
Для C/C++ краще взяти github.com/codelibs/libdxfrw
Для C# рекомендую github.com/ixmilia/dxf
OpenCASCADE — це повноцінний CAD моделлер базис колишнього Euclid CAD, як із 3D твердотільним моделюванням так і 2D скетчі які необхідний для твердотільного моделювання. Є проект де чисто 2D sourceforge.net/projects/occsketcher
Щодо бібліотек із підтримкою DWG, DXF то їх є не мало, сама просунута із свободних ніби LibreDWG. Запхати її у Web через WebASM можна бо вже приклали як це робили.
BTW DXF — підтримує і 3D у виді мешей, без текстур, анімацій і т.п. як у COLADA чи GLTF.
Взагалі є безліч доступного (зокрема безкоштовного) софту з подібним функціоналом. Моя ідея — працювати «миттєво» відкривши вкладку в браузері. Вважаю сучасний браузер універсальним інструментом який може справитись з схожими завданнями. Моя ціль — не «знищити» AutoCAD/FreeCad etc, а дати можливість виконати просту задачу за допомогою просто відкритої вкладки в браузері. Якісної імплементації такої ідеї я поки не зустрів. Autodesk має платні версії веб автокаду наскліьки мені відомо
Fusion 360 — це цілий Invertor повністю працює в Web. Э ще ScatchUp наприклад і т.п.
Через WebASM, WebGL усе давнр портовано в Web для прикладу dev.opencascade.org/...l/occt_samples_webgl.html
Тобто питання з розряду «нащо сворбвати ще один сорт пива, при чому інді розробником?».
Як бізнес поект це звісно погана ідея, тут давно червоний океан конкуренції.
Я використовую QCad
На клієнтському JavaScript немає готових бібліотек для читання dxf? Це популярний формат
Усе звісно є і можна через той же WebASM втягнути той же ASIMP lib і т.п. Як написав автор проблема в тому, що стійка ЧПУ і сам автокад навіть валідний файл із ніби то відкритим форматом DXF (сам автокад працює із DWG) не сприймає. Насправді такі проблеми є із будь якими обмінними форматами як то IGES чи STEP. (Є між іншим варіант писати не файл, а макрос на LISP якій збудує креслення в автокаді, років із 20 тому це був рдин із моїх курсових проектів в університеті).
Для цього пишуть пост і пре процессори для CAE ситстем при імпорті експорті із конкрктних CAD та на конкретні стійки ЧПУ, що продаються за дуже солідні грощі.
javascript має кілька бібліотек для читання dxf, я переглядав найпопулярніші. Вони дуже примітивні і, на жаль, не здатні задовольнити мої потреби.
PDF теж цікавий формат.
Просто хочу побажати вам успіху.
Пишаюся що це наш відчизняний продукт і бачу дуже багато перспектив.
Навіть якщо ви не планували робити це комерційним — все ж доменна експертиза дає вам велику перевагу для створення цілої екосистеми подібних продуктів. Якщо взяти просто ядро того що є і масштабувати з бекендом і іншими плюшками, включаючи АІ інтеграцію і створення моделей по промпту.
Також із ідей — це можливо компілювати весь клієнтський код у web-assembly (не знаю чи ця технологія досі жива) але потенційно — це вдосконалення ефективності / швидкості роботи + приховування вихідного кода, бо наразі ви безкоштовно через клієнтський код віддаєте всі алгоритми, хоч білд можливо і обфускований
В мене відразу зявилась думка, чому немає 3д, але дочитавши до кінця побачив відповідь, не впевнений що це дійсно треба, але можливо ця ніша теж себе знайти.
Тому тут можна було б робити нішеві інструменти для різних напрямків:
— моделювання електроніки
— 3д друк
— лазерна різки та інші чпу станки
— моделювання меблів (розпил деталей) чи виробів для металообробки (а-ля FreeCAD)
Отож сподіваюсь цей продукт виллється в такого собі відчизняного єдинорога. Головне продовжуйте, можливо скоро будемо проситися до вас в команду )
Дякую за відгук:) Поки розглядаю цей проект як не комерційний. Подивимось як змінюватиметься користувацька база протягом часу
Нажаль доменна эскпертиза в САПР — це з розряду хоббі чи якихось дрібних бізнесів, або не працюючих державних підреприємств і т.п. і про недостатній як по світовим так і по міркам великих міст заробітню плату. Тому грощі як автором статті так і іншими обивателями заробляються наприклад Java — бекендом. Rocket Since — це для країн які будують свої ракети, ті же PAC-3 Patriot, для «зулусів» воно не дуже затребувано.
А от з набудьтся «продуктової експертизи» (сам собі ставиш цілі із задач із проблематик які бачиш), я так в 2006 засів за вивчення новомодної тоді Java як частини дипломного проекту, бо вона давала технологію Applet і 3D графіку запхав у Web без аппаратного прискорення ще, щоправда (WebGL спеціфікація з’явилась в 2008, тоді ще Canvas 3D, навіть листувались із авторами вже на робочому місці бо я працював над Mozilla. Тоді прийняття в стандарт довго блокувала Microsoft просуваючи свій Silverlight із DirectX доки під тиском Apple не прийняли в 2011).