FreeCAD — новий метод малювання
Disclamer: Я ніколи в своєму житті не працював з CAD/CAM додатками раніше, і раптом довелося. Принципи роботи FreeCAD мене так захопили, що це вимагає термінового поста, щоб розповісти іншим.
Написане в цьому пості, найімовірніше, буде тривіальним і нудним для більшості активних користувачів CAD, і цей пост націлений в першу чергу на не-користувачів CAD з метою розповісти їм про чудовий новий світ комп’ютерної графіки.
Вступ
У мене виникла проста задача — зробити 3D модель своєї квартири. Не просто “стінки в розмір”, а всі балки, виступи і нахили. Я спробував одну, другу, третю програму… Я зневірився (почалося з SweetHome3D, а закінчилося blender і inkscape). Вони всі були страшенно незручними. Серед програм, які я спробував, був і FreeCAD, який я пропустив через “ніфіга не робити” і “не працює”. Після того, як я зневірився, я ще раз пішов по другому колу. На цей раз, трохи більше читаючи документацію… І FreeCAD не тільки “злетів”, але і ще і відкрив для мене чудовий новий світ точного векторного малювання, що ґрунтується на Constrains.
Проблеми моделювання
Для початку я розповім про ту біль, від якої я страждав у різних редакторах.
Почнемо з SweetHome3D. Умовно-зрозумілий інтерфейс, що дозволяє описати кімнату як “стать” (де задається форма і виступи), навколо якої робиться “стіна”. SweetHome3D дав мені дві проблеми: піксельхантинг (розмір змінюється або мікроскопічними зрушеннями миші, або в діалозі, але не існує методу “притиснути” стінку до підлоги з точністю — тільки піксельхантинг. Друга проблема — модель SweetHome3D не передбачає існування балок, арок і інших елементів стіни, не виконуються зверху до низу. Додатково, SH3D не вміє похилих стін і підлоги (я б хотів, щоб таких проблем у мене не було, але перед тим, як цю проблему усувати IRL, її треба задокументувати). Тобто SH3D покриває 90% того, що мені було потрібно, доставляючи неймовірну біль з 5%, і роблячи неможливим решта 5%.
Blender теоретично дозволяє зробити все, але тільки теоретично. На практиці або моїх навичок не вистачало, або сам процес дуже повільний, але намалювавши три з половиною кута, я здався. Занадто повільно і занадто багато метушні з освітленням та іншими неважливими речами. Плюс (наскільки я знаю), Blender навряд чи зможе показати нормальні 2D проекції з розмірами.
Inkscape був хороший крім однієї проблеми — в багатосекційні лінії (F2) неможливо задати розміри кожної секції. Можна було б — я б все в Inkscape так і малював.
… Але мій пост не про абсолютну перевагу FreeCAD над Blender (я обох їх новачок і порівняти не можу), а про новий стиль малювання. Спочатку про проблеми старого стилю (тобто “звичайного” векторного малюнка).
Проблема піксель-хантингу
Перед тим, як перейти до картинок і поясненню ідеї Constrains, я хочу зосередитися на кількох проблемах, що одвічно переслідують векторні малюнки:
- Майже об’єднані криві. Якщо дві криві майже стикаються, то можна подумати, що вони стикаються. У якийсь момент (при друці, або при подальших маніпуляціях), картинка розвалиться.
- Майже паралельні/перпендикулярні лінії. Вони паралельні, але не до кінця.
зверніть увагу на outline, він показує, що описує прямокутник для двох ліній більше самої лінії, тобто лінія під гострим кутом.
- похідна від попереднього — лінії, що стикуються під кутом 0.001°.
- неточності в розмірах і товщині ліній. Лінія має свою товщину, і при редагуванні (поворотах, ресайзах і т. д.) товщина починає плисти. Більш того, в більшості векторних реакторів важко намалювати квадрат з площею 100 і лінією товщиною 0.5 (тому що лінія на 50% заходить на площу фігури, і ми маємо не 10х10 всередині, а 9.75х9.75).
- Збереження align’а і симетрії є завданням, що вимагає постійної уваги.
В редакторах вбудовано безліч інструментів для боротьби з подібними неприємностями, але в цих інструментів є одне ускладнення — їх треба осмислено застосовувати там, де виникла проблема. А за виникненням проблем треба стежити самому.
Constrains
Це було довгий вступ.
Давайте спробуємо намалювати квадрат зі стороною 10, спираючись на його фундаментальні властивості.
У квадрата 4 прямі краї.
Майже вийшло. Солвер підказує, що нам треба задати 15 додаткових утримуючів зв’язків, щоб наша фігура була однозначною (у неї було 0 ступенів свободи).
- Протилежні сторони квадрата паралельні *
Солвер каже, вже краще. Стало не вистачати 13. Зверніть увагу на червоні позначки — це вказівка на constrains. На самому початку у нас випадково вийшло два обмеження — дві горизонтальні лінії.
Стало краще, хоча на квадрат це все ще мало схоже. Що ж не так? Ах, так, квадрат — це полігон, а біля полігону сторони сходяться в кутах в точку. Додамо ці обмеження.
Вийшло трохи несподівано, хоча solver все більш задоволений. Зазначена фігура — звичайний такий чотирикутник, в якому сторони попарно паралельні. Трохи за межами шкільного курсу, але цілком зрозуміло.
Додамо обсягу… площини до цієї постаті. Сусідні грані — перпендикулярні.
Вже схоже на правду (хоча це я трохи підтягнув вгору малюнок, тому що сторони нульового розміру цілком влаштовують solver як перпендикулярні до прямої, на якій лежать (у вигляді точок)). solver лається на надлишок обмежень. Погодимося з ним і видалимо одну перпендикулярність (у нас вимога попарної паралельність, перпендикулярність для однієї пари автоматично випливає із перпендикулярності першої пари). Після того, як ми видалили зайве, solver скаржиться на 4 свободи.
Заборонимо ще що-небудь, так як свободи занадто багато.
Наприклад, скажімо, що всі сторони повинні бути однакового розміру. Досить зробити це для двох будь-яких суміжних сторін, і з цього випливає, що всі сторони рівні (шкільна геометрія!).
Після цього у нас виходить три свободи. Ще три свободи? Але квадрат ж… Так, це квадрат, але ми не знаємо його розміру (0 — теж розмір, між іншим), і положення у просторі.
Задамо його зазначимо, що один з кутів квадрата лежить на точці “0, 0”, плюс задамо для однієї з сторін розмір у 10мм.
Все, квадрат повністю готовий, у нього немає свобод, а значить, немає і прихованих помилок.
Цей приклад був трохи гротескним, але, як я сподіваюся, виразним. Особливо мене вразило, що solver не тільки перевіряє на відсутність неоднозначностей, але ще і попереджає, якщо фігура містить більше обмежень, ніж треба.
Лірика
Для мене такий метод опису малюнка є абсолютно новим і несподіваним. В якомусь сенсі він нагадує те, що роблять типізовані мови програмування з машинним кодом — додають в нього обмежень, що дозволяють математично-точної формі задати обмеження на можливі операції з даними. В той момент, коли обмежень досить багато, ми отримуємо однозначне рішення, яке точно і точно однозначне. І точно правильне, якщо вхідні дані були правильними. І ніяких “випадково зачепив мишкою” або “рука здригнулася”.