Писал роман — разработал экраноплан: используем ИИ и FreeCAD для инженерной проработки вымышленной техники

Привет друзья. Написано уже половина романа, статьи о интересных моментах процессах тоже готовятся. А сейчас я хочу рассказать о том, как я для реалистичности технических деталей романа пришлось разработать целый экраноплан. Да, именно забытые и не очень хорошо показавшие себя технологии на стыке авиации и судостроительства.

По сюжету романа нужна была такая машина, которая может двигаться ниже зоны действия радаров, незаметно, пользуясь складками местности. Обычные самолеты и вертолеты в принципе могут, но сильно прижаться к земле, чтобы идти в 1-3 метрах от поверхности земли им не под силу. Это зона действия только для экранопланов.

Писал роман — разработал экраноплан: используем ИИ и FreeCAD для инженерной проработки вымышленной техники

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

основные недостатки существующих экранопланов

  • Чувствительность к состоянию поверхности. Экраноплан живет за счет экранного эффекта — роста давления под крылом при приближении к поверхности. Но что, если эта поверхность перестает быть зеркально гладкой? Любая значительная волна превращает полет в опасное «прыгание»

  • Балансировка, продольная устойчивость машины. Центр давления на крыле при изменении высоты полета смещается. Если нос чуть приподнимается, экранный эффект ослабевает, машина «проседает», и если автоматика или пилот не компенсируют это мгновенно — неизбежен удар о воду или «кобрирование» (резкий взмы�� вверх с последующим сваливанием).

  • Переходные режимы. Требуется колоссальная избыточная мощность двигателей, которая в крейсерском режиме становится «балластом». Это делает экранопланы крайне неэкономичными по сравнению с обычными самолетами или судами на подводных крыльях

Это главные недостатки, которые реально не делают их интересными и для эксплуатации, и для конструкторов. Но если задуматься - а можно ли эти недостатки победить на существующем уровне развития технологий? Ида, в принципе это возможно. Ниже решения, которые мы проработали с нейросетями.

Решения лечения детских болезней экранопланов

  • Проблема: Продольная неустойчивость («скачки» по тангажу)

    Решение: Схема «Утка» с активным канардом. Переднее горизонтальное оперение работает в возмущенном потоке первым, а ИИ-контроллер меняет его угол атаки сотни раз в секунду, демпфируя колебания еще до того, как их почувствует основной корпус.

    • Проблема: Тяжелый взлет («горб» сопротивления)

      Решение: Распределенная электрическая тяга (DEP). Вместо двух монструозных двигателей — каскад электромоторов по передней кромке. На взлете они создают мощный статический поддув под крыло, буквально выталкивая машину из воды на воздушную подушку без лишнего разбега.

      • Проблема: Боязнь волнения и турбулентности

        Решение: Управление пограничным слоем (BLI). Использование части вентиляторов DEP для активного отсоса или выдува воздуха с поверхности крыла. Это позволяет мгновенно менять подъемную силу без движения механических закрылков, «сглаживая» удары воздушных потоков от волн.

      • Дополнительно: Ошибки пилотирования на сверхмалых высотах

        Решение: Сенсорный стек (Лидар + Нейросеть). Лидар сканирует профиль воды на километр вперед, а нейросеть (обученная на моем «правильном скрипте») заранее вычисляет траекторию обхода препятствий, делая полет безопаснее, чем на обычном лайнере. К слову полного доверия нейросетям тут не должно быть. Нейросеть рисует маршрут, но физика в лице жесткого алгоритма ставит на нем печать «Одобрено». Если ИИ предлагает маневр, нарушающий законы аэродинамики, управление перехватывает классический PID-регулятор и просто удерживает горизонт.

      В общем на основании таких технических возможностей современной (и в некоторых случаях еще лабораторной, находящейся в испытаниях) науки и техники мы разработали характеристики планера с полными ТТХ машины.

      Технический паспорт

      Скрытый текст

      ТЕХНИЧЕСКИЙ ПАСПОРТ ЭКРАНОПЛАНА «ТЕНЬ-М» (014М4)

      Версия 3.1 — Спецификация экспериментального образца

      Статус: Проектная документация, в разработке, на стадии тестирования
      Назначение документа: Техническое описание экспериментального экраноплана с гибридной силовой установкой и системами активного управления

      РАЗДЕЛ 1: ОБЩИЕ СВЕДЕНИЯ

      1.1. Классификация и назначение

      Параметр

      Значение

      Тип аппарата

      Экраноплан (ground effect vehicle)

      Класс

      Многоцелевой транспортный

      Силовая установка

      Гибридная: 1 × ТРДД + 24 × электродвигателя КВ-24

      Режимы полёта

      Экранный (3–5 м), переходный, самолётный, висение (до 180 с)

      Конструкционный стандарт

      Композитный планер с интегрированными системами

      РАЗДЕЛ 2: ГЕОМЕТРИЧЕСКИЕ ХАРАКТЕРИСТИКИ

      2.1. Основные размеры

      Параметр

      Значение

      Длина фюзеляжа

      11 200 мм

      Ширина фюзеляжа (макс.)

      2 600 мм

      Высота фюзеляжа (макс.)

      2 200 мм

      Высота на шасси

      3 500 мм

      2.2. Фюзеляж (опорные сечения)

      X (мм)

      Ширина (мм)

      Высота (мм)

      Смещение центра (мм)

      0

      200

      400

      200

      2 000

      1 600

      2 400

      1 000

      5 500

      2 600

      2 200

      1 000

      9 000

      1 800

      1 800

      800

      11 200

      600

      800

      400

      2.3. Крыло

      Параметр

      Значение

      Профиль

      NACA 4412 (модифицированный)

      Размах

      13 000 мм

      Площадь

      50 м²

      Угол обратной стреловидности

      Сечения крыла:

      X (мм)

      Y (мм)

      Z (мм)

      Хорда (мм)

      Относительная толщина

      3 500

      600

      900

      4 800

      14%

      3 300

      2 800

      930

      4 200

      13%

      3 050

      4 500

      970

      3 600

      12%

      2 650

      6 500

      1 050

      2 800

      10%

      2.4. Законцовки крыла (эндплейты/V-кили)

      На законцовках крыла установлены вертикальные (с небольшим наклоном) законцовки — эндплейты, выполняющие функцию дополнительного оперения и снижения индуктивного сопротивления.

      Параметр

      Значение

      Высота законцовки

      1 100 мм

      Наклон

      8° назад, 3° наружу

      Хорда у основания

      2 800 мм

      Хорда у вершины

      1 624 мм

      Относительная толщина

      10% (осн.) / 8.8% (верш.)

      2.5. Переднее горизонтальное оперение (канард)

      Параметр

      Значение

      Профиль

      NACA 4412

      Размах

      2 400 мм

      Корневая хорда

      1 800 мм

      Концевая хорда

      1 260 мм

      Угол установки

      0.5° (относительно горизонтали)

      Положение (X)

      800 мм

      2.6. Рули высоты (элеваторы)

      Параметр

      Значение

      Профиль

      NACA 4412

      Размах

      2 400 мм

      Хорда

      540 мм

      Положение (X)

      2 060 мм

      2.7. Вертикальное оперение (V-образные кили)

      Два V-образных киля, интегрированных в хвостовую часть фюзеляжа.

      Сечения левого киля (отрицательные Y):

      X (мм)

      Y (мм)

      Z (мм)

      Хорда (мм)

      9 000

      -1 100

      1 700

      2 200

      9 600

      -800

      1 700

      1 600

      10 200

      -500

      1 700

      1 000

      10 750

      -225

      1 700

      450

      Вершина киля:

      Параметр

      Значение

      X

      10 300 мм

      Y

      ±1 850 мм

      Z

      3 500 мм

      Хорда

      600 мм

      Промежуточные сечения: 25%, 50%, 75% высоты для обеспечения плавности формы.

      2.8. Заднее горизонтальное оперение (Т-стабилизатор)

      На вершинах килей установлен Т-образный стабилизатор.

      Параметр

      Значение

      Корневая хорда

      1 400 мм

      Концевая хорда

      620 мм

      Размах

      2 200 мм

      Вынос вперёд

      420 мм

      Профиль

      NACA 4412

      2.9. Грузовой отсек

      Параметр

      Значение

      Длина

      4 500 мм

      Ширина

      2 100 мм

      Высота

      1 700 мм

      Объём

      16 м³

      Грузовой люк

      Аппарель в хвостовой части

      Грузоподъёмное устройство

      «Ловчая Лапа» (раздвижной пол, лебёдка, траверса)

      РАЗДЕЛ 3: СИСТЕМА КВ-24 (ВЕНТИЛЯТОРЫ)

      3.1. Расположение вентиляторов

      24 электродвигателя с тянущими винтами расположены в задней кромке крыла,
      по 12 на каждой консоли.

      3.2. Характеристики вентилятора

      Параметр

      Значение

      Диаметр наружного кожуха

      320 мм

      Диаметр вентилятора

      290 мм

      Длина кожуха

      600 мм

      Угол наклона оси

      15° вниз

      Материал

      Композитный

      Привод

      Электродвигатель

      РАЗДЕЛ 4: СИЛОВАЯ УСТАНОВКА

      4.1. Архитектура

      Гибридная: один маршевый турбовентиляторный двигатель + распределённая электрическая тяга (24 вентилятора КВ-24) + система кратковременного форсажа на перекиси водорода.

      4.2. Маршевый двигатель

      Параметр

      Значение

      Тип

      Турбовентиляторный двухконтурный (ТРДД)

      Модель

      ТВ7-117СМ-Ф (форсированный)

      Производитель

      АО «ОДК-Климов»

      Характеристики:

      Режим

      Тяга (кгс)

      Расход топлива (кг/ч)

      Температура газов (°C)

      Крейсерский (50%)

      1 800

      450–550

      950

      Повышенный (70%)

      2 500

      700

      1 050

      Взлётный (100%)

      3 600

      950

      1 150

      Форсаж (с HTP)

      6 000

      2 200

      1 400

      4.3. Воздухозаборник

      Параметр

      Значение

      Расположение (X)

      3 000–4 000 мм

      Расположение (Z)

      Верхняя часть фюзеляжа

      Диаметр

      600 мм

      Тип

      Регулируемый, с защитными створками

      4.4. Реактивное сопло

      Параметр

      Значение

      Расположение (X)

      10 500–11 000 мм

      Форма

      Прямоугольная, 400 × 200 мм

      Регулировка

      Подвижные створки для изменения вектора тяги

      4.5. Генератор и аккумуляторы

      Параметр

      Значение

      Генератор

      Высокооборотный синхронный, 1.8 МВт, 115/400 Гц, масса 550 кг

      Аккумуляторы

      Литий-воздушные (Li-air), 250 кВт·ч, удельная энергия 500 Вт·ч/кг, масса 500 кг

      РАЗДЕЛ 5: ТОПЛИВО И РАБОЧИЕ ТЕЛА

      Вид

      Масса (кг)

      Объём (л)

      Назначение

      Керосин JP-8

      2 000

      2 500

      Основное топливо для ТРДД

      HTP (98%)

      400

      330

      50% — система управления, 50% — форсаж висения

      РАЗДЕЛ 6: МАССО-ГАБАРИТНЫЕ ХАРАКТЕРИСТИКИ

      6.1. Минимальный оперативный вес (OEW)

      Элемент

      Масса (кг)

      Фюзеляж (композит)

      1 200

      Крыло (с наплывами)

      1 800

      Оперение (V-кили + Т-стаб + канард)

      600

      Система КВ-24 (24 вентилятора)

      1 500

      Системы управления

      800

      Маршевый двигатель с системами

      1 550

      Система HTP

      230

      Прочие системы

      420

      ИТОГО OEW

      8 100

      6.2. Максимальная взлётная масса (MTOW)

      Параметр

      Масса (кг)

      OEW

      8 100

      Керосин (2 000 кг)

      2 000

      HTP (400 кг)

      400

      Экипаж (2 чел)

      200

      Масса без груза

      10 700

      Полезная нагрузка (макс.)

      1 000

      ИТОГО MTOW

      11 700

      РАЗДЕЛ 7: ЛЁТНО-ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ

      Параметр

      Значение

      Крейсерская скорость (экран)

      260–300 км/ч

      Максимальная скорость

      420 км/ч

      Дальность (с нагрузкой 1 000 кг)

      1 850 км

      Практический потолок

      3 500 м

      Потолок висения

      1 500 м

      Длина разбега/пробега

      50–70 м

      Длительность висения (штатный)

      120 с

      Длительность висения (макс.)

      180 с

      РАЗДЕЛ 8: КЛЮЧЕВЫЕ СИСТЕМЫ

      • Комплекс малозаметности «ПОКРОВ-М2» — плазменные ячейки в передних кромках.

      • Система «Рефлекс-М» — импульсное управление на HTP.

      • Бортовой комплекс «УЛЕЙ-М» — ИИ управления, координация группы, управление роем дронов.

      • Защита от ЭМИ «ФАРАД-М» — пассивное и активное подавление.

      РАЗДЕЛ 9: ЭКСПЛУАТАЦИОННЫЕ ПОКАЗАТЕЛИ

      Параметр

      Значение

      Назначенный ресурс

      5 500 лётных часов / 18 лет

      Стоимость единицы (серийная)

      ≈ 4.2 млрд руб.

      Годовая стоимость эксплуатации

      ≈ 800 млн руб.

      Но сделать паспорт машины это одно. Как же она будет выглядеть?

      Нейросети делают модель экраноплана

      Хотя и уверенно работаю в CAD системах, но мне было лень по этим ТТХ строить модель машины. Во первых я смутно представлял его внешний вид и что именно стоит делать. Во вторых это займет много времени. Я ведь считаю затраты времени не только на само моделирование, но и поиск тех же профилей NACA для крыла.
      Но DeepSeek сам подсказал решение. FreeCAD имеет собственную консоль на Python, нейросети делают скрипт - запускаю его и модель строится сама. Звучит красиво. На практике вышло не очень легко, но это тоже опыт.
      Нейросети ошибались, ломали модель, крылья создавались вдалеке от фюзеляжа. По итогу несколько часов работы сначала в DeepSeek, потом в Gemini, с доработкой в Claude и получилась вполне вменяемая модель, которую частично уже сейчас даже можно проверить и на аэродинамику.
      При всем этом, по внешнему виду, модель получилась вполн�� летабельной.

      Попозже я попробую изучить и аэродинамику модели. Уж очень интересно, что покажет анализ.

      Для этого буду использовать FreeCAD с верстаком CfdOF (Computational Fluid Dynamics for OpenFOAM).

      Самое сложное было — заставить ИИ понять, что вентиляторы КВ-24 должны быть интегрированы в заднюю кромку, а не просто висеть в воздухе. В итоге, после десятка требований дотянуть их до крыла, FreeCAD выдал геометрию, которую вы видите на рендерах. Она выглядит футуристично, но при этом функционально — каждый элемент здесь оправдан расчетами. Однако пока вентиляторы не полноценны для CFD анализа, так как просто воткнуты в крыло. Возможно будут править вручную или продолжу пытать себя и нейросети.

      Зачем вообще мне так напрягаться?

      Мог ли я просто написать в романе: «Они сели в быстрый экраноплан и полетели»? Конечно. Но когда у тебя в руках есть ТТХ, когда ты знаешь, что на скорости 150 км/ч твоя машина ест 120 литров топлива и «чувствует» экран на высоте до 1.5 метров, сцена меняется.

      1. Сюжет, продиктованный физикой, а не фантазией Я хотел максимально реалистичных действий. В моей книге нет «двигателей на мане», которые работают столько, сколько нужно автору. Есть жесткие цифры:

      • Топливный лимит: Если на скорости 150 км/ч машина ест 120 литров в час, а в баках осталось на два часа лета — герои не долетят до цели магическим образом. Им нужна дозаправка, им нужно искать решение, рисковать. Сюжет подгоняется под реальность, а не наоборот.

      • Эргономика страдания: Ограничения по тоннажу и объему грузового отсека экраноплана "Тень" — это не просто строчки в таблице. Это значит, что десант сидит в тесноте, плечом к плечу, в душном отсеке, где каждый лишний килограмм оборудования может сорвать взлет. Герои не катаются на стерильном звездолете будущего — они выживают в тесной, ревущей и сложной машине. Это дает ту самую глубину сопереживания, которую невозможно выдумать.

      2. Наследие Жюля Верна Вспомните «Наутилус» капитана Немо или «Альбатрос» Робура-Завоевателя. Жюль Верн не просто говорил «они поплыли под водой». Он давал конкретные размеры, описывал конструкцию двигателей, балластных цистерн и внутреннее устройство. Результат? Читатель верил в эти аппараты настолько, что десятилетия спустя инженеры получали реальные патенты, основываясь на описаниях из его романов. Я верю, что достоверность в деталях — это то, что отличает «чтиво на вечер» от мира, в который хочется вернуться.

      3. ИИ как соавтор-инженер Именно здесь нейросети стали незаменимы. Когда я говорил: «Мне нужно перевезти 1 тонну груза на 2000 км, рассчитай потребную мощность», — ИИ не просто выдавал цифру, он заставлял меня пересматривать компоновку фюзеляжа. Это был диалог с «виртуальным КБ», где физика была главным цензором.

      Выводы эксперимента

      Работа над экранопланом "Тень" для романа в итоге переросла из литературного упражнения в полноценный технический концепт. Как инженер, я пришел к следующим выводам:

      1. Неожиданный итог! Традиционные экранопланы страдали от узкого эксплуатационного диапазона. Использование распределенной электрической тяги (DEP) в связке с канардом (это небольшое предварительное крыло у носа самолета или экраноплана) полностью меняет уравнение. Мы доказали (пусть пока только в умах нейросетей), что активное управление пограничным слоем позволяет демпфировать продольные колебания, которые раньше делали полет на экране опасным аттракционом. Возможно это даст развитие старой недоделанной технологии в будущем.

      2. Инструментарий: ИИ как исполнительный механизм Нейросети для меня не «творцы», а интерфейс к CAD-системам. DeepSeek/Claude/Gemini/ChatGPT выполняли роль младших конструкторов: писали Python-скрипты для FreeCAD, рассчитывали координаты профилей NACA и генерировали элементы. Учитывая, что именно с FreeCAD я не разбирался и не могу в нем работать - это было интересно. Вручную я бы скорее все делал в Компас-3D.

      3. Реализм как метод тестирования Я решил написать именно такой роман, который сам бы хотел прочитать: без «голливудских сказок», на основе чего-то реально ощутимого, во что я сам мог бы поверить как профессионал. Здесь физика диктует сценарий: если конструкция не позволяет выполнить задачу по сюжету — это не проблема сюжета, которую можно исправить парой строк. Это технический сигнал к тому, чтобы вернуться к чертежам и пересмотреть саму конструкцию. Либо необходимо изменить проведение самой операции так, чтобы можно было полагаться на существующие возможности. Сюжет здесь не оправдание для магии, а суровая проверка инженерной гипотезы.

      4. Нет плохих идей, есть несовершенство технологий. Экранопланы не взлетели в XX веке не из-за порочности идеи, а из-за отсутствия систем управления и материалов, которые есть у нас сейчас. Сегодня, используя связку из ИИ, Python и современных систем автоматизированного проектирования, один инженер может реанимировать целые классы техники, показав новый взгляд на осуществление этих конструкций.


      ГЛАВНОЕ ПРЕДУПРЕЖДЕНИЕ!

      При всех описанных в статье преимуществах важно помнить главное- нейросети не являются специалистами. Они могут помочь, как например мне в создании более-менее реалистичного, хоть и футуристичного мира. Но реальное создание конструкций и аппаратов должно вестись под руководством опытных специалистов в этой сфере!


      Статус проекта

      На текущий момент мы имеем готовую геометрию, ТТХ и понимание принципов управления. Следующий логический шаг — полноценный CFD-анализ в OpenFOAM. Нужно подтвердить расчетные коэффициенты подъемной силы при взаимодействии с экраном на разных скоростях. И этим я займусь в ближайшем будущем.

      Вопрос к сообществу

      Заканчивая этот обзор, я хотел бы задать пару вопросов читателям Хабра, чьи профессиональные компетенции и личный опыт мне очень интересны:

      1. Насколько, по вашему мнению, допустим «технический реализм» в художественной литературе? Стоит ли авторам уходить в такие детали, как расчеты профилей крыла и расхода топлива, если это усложняет текст? Или именно такая «честная» инженерия и делает вымышленный мир по-настоящему живым и убедительным?

      2. Как вы считаете, какие возможности текущий уровень развития техники (ИИ, аддитивные технологии, новые композиты) может дать старым технологиям и «забытым» изобретениям? Я на своем примере увидел, как связка из LLM и CAD-систем способна вдохнуть новую жизнь в концепт экраноплана. Есть ли у вас идеи или примеры того, что ещё стоит «реанимировать» с помощью современных инженерных инструментов?

      Дополнение для любопытных

      Если Вам интересно, я прикладываю скрипт для построения модели экраноплана. Для CFD он еще не готов в полной мере, поэтому я думаю его еще не раз изменю, но запустить его в FreeCAD и посмотреть саму модель возможно.

      Процесс проектирования продолжается параллельно с написанием глав. Если среди читателей есть специалисты по аэродинамике, буду благодарен за критику ТТХ — в моем мире физика важнее авторского произвола

      Скрытый текст

      -- coding: utf-8 --

      TEN_M_V7 — ПОЛНОСТЬЮ ИСПРАВЛЕННАЯ ВЕРСИЯ

      import FreeCAD as App
      import Part
      import math
      from FreeCAD import Base
      import os

      doc = App.newDocument("TEN_M_V7")

      =====================================================

      Фюзеляж — сечения

      =====================================================

      FUSFRAMES = [
      (0, 200, 400, 200),
      (2000, 1600, 2400, 1000),
      (5500, 2600, 2200, 1000),
      (9000, 1800, 1800, 800),
      (11200, 600, 800, 400),
      ]

      def fus_z_top(x):
      for i in range(len(_FUS_FRAMES)-1):
      x1,w1,h1,o1 = FUSFRAMES[i]
      x2,w2,h2,o2 = FUSFRAMES[i+1]
      if x1 <= x <= x2:
      t = (x-x1)/(x2-x1)
      h = h1 + (h2-h1)*t
      o = o1 + (o2-o1)*t
      return o + h/2
      return FUSFRAMES[-1][3] + FUSFRAMES[-1][2]/2

      def fus_y_max(x):
      for i in range(len(FUS_FRAMES)-1): x1,w1,,_ = FUS_FRAMES[i] x2,w2,,_ = FUSFRAMES[i+1]
      if x1 <= x <= x2:
      t = (x-x1)/(x2-x1)
      w = w1 + (w2-w1)*t
      return w/2
      return FUSFRAMES[-1][1]/2

      =====================================================

      NACA ПРОФИЛЬ — возвращает Wire

      =====================================================

      def naca4(t, chord, n=80):
      pts = []
      for i in range(n+1):
      x = i/float(n)
      yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
      pts.append(Base.Vector(xchord, 0, ytchord))
      for i in range(n,-1,-1):
      x = i/float(n)
      yt = 5t(0.2969math.sqrt(x)-0.1260x-0.3516x**2+0.2843x3-0.1015*x4)
      pts.append(Base.Vector(xchord, 0, -ytchord))
      pts.append(pts[0])
      return Part.Wire(Part.makePolygon(pts))

      =====================================================

      КРЫЛО

      =====================================================

      wing_data = [
      (3500, 600, 900, 4800, 0.14),
      (3300, 2800, 930, 4200, 0.13),
      (3050, 4500, 970, 3600, 0.12),
      (2650, 6500, 1050, 2800, 0.10),
      ]
      tip_x, tip_y, tip_z = 2650, 6500, 1050
      tip_chord, tip_t = 2800, 0.10

      sects = []
      for x,y,z,c,t in wing_dаta:
      p = naca4(t, c)
      p.translate(Base.Vector(x, y, z))
      sects.append(p)

      wingL = Part.makeLoft(sects, True, False)

      =====================================================

      ЭНДПЛЕЙТ

      =====================================================

      def create_endplate(tip_x, tip_y, tip_z, chord, t, depth):
      taper = 0.58
      sweep = math.tan(math.radians(8)) depth
      cant = math.tan(math.radians(3))
      depth

      root = naca4(t, chord)
      root.translate(Base.Vector(tip_x, tip_y, tip_z))
      
      vtip = naca4(t*0.88, chord*taper)
      vtip.translate(Base.Vector(tip_x+sweep, tip_y+cant, tip_z-depth))
      
      ep = Part.makeLoft([root, vtip], True, False)
      
      # Нижняя запирающая пластина
      pl = chord*0.48
      pt = 90
      ep = ep.fuse(Part.makeBox(pl, pt, 65, Base.Vector(tip_x + chord*0.26, tip_y+cant-pt/2, tip_z-depth-32))).removeSplitter()
      return ep
      

      wingletL = create_endplate(tip_x, tip_y, tip_z, tip_chord, tip_t, 1100)
      wingL = wingL.fuse(wingletL).removeSplitter()
      wingR = wingL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))

      =====================================================

      КАНАРД

      =====================================================

      def create_canard():
      root = naca4(0.12, 1800)
      root.translate(Base.Vector(800,0,700))
      tL = naca4(0.12, 1260)
      tL.translate(Base.Vector(800,-1200,700))
      tR = naca4(0.12, 1260)
      tR.translate(Base.Vector(800,1200,700))
      s = Part.makeLoft([tL, root, tR], True, False)
      s.rotate(Base.Vector(800,0,700), Base.Vector(0,1,0), 0.5)
      return s

      def create_elevator():
      l = naca4(0.12, 540)
      l.translate(Base.Vector(2060,-1200,700))
      r = naca4(0.12, 540)
      r.translate(Base.Vector(2060,1200,700))
      return Part.makeLoft([l, r], True, False)

      =====================================================

      V-КИЛЬ — с плавными сечениями

      =====================================================

      def create_vstab(side):
      TE_x = 11200
      root_stations = [(9000,2200),(9600,1600),(10200,1000),(10750,450)]
      loft_sects = []

      for x_le, chord in root_stations:
          z = fus_z_top(x_le)
          y = side * fus_y_max(x_le)
          sec = naca4(0.12, chord)
          sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90)
          sec.translate(Base.Vector(x_le,y,z))
          loft_sects.append(sec)
          print(f"Корень {side}: x={x_le}, y={y:.1f}, z={z:.1f}, chord={chord}")
      
      # Вершина киля
      h = 1800
      tilt = 22
      last_x, last_chord = root_stations[-1]
      last_z = fus_z_top(last_x)
      last_y = side * fus_y_max(last_x)
      x_tip = 10300
      y_tip = side*(abs(last_y) + math.tan(math.radians(tilt))*h)
      z_tip = last_z + h
      chord_tip = 600
      
      # Добавляем промежуточные сечения для плавного Loft
      for f in [0.25,0.5,0.75]:
          xi = last_x + f*(x_tip-last_x)
          yi = last_y + f*(y_tip-last_y)
          zi = last_z + f*(z_tip-last_z)
          ci = chord_tip + (last_chord - chord_tip)*(1-f)
          s = naca4(0.12, ci)
          s.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90)
          s.translate(Base.Vector(xi, yi, zi))
          loft_sects.append(s)
      
      tip_sec = naca4(0.12, chord_tip)
      tip_sec.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), 90)
      tip_sec.translate(Base.Vector(x_tip, y_tip, z_tip))
      loft_sects.append(tip_sec)
      
      print(f"Вершина {side}: x={x_tip}, y={y_tip:.1f}, z={z_tip:.1f}, chord={chord_tip}")
      fin = Part.makeLoft(loft_sects, True, False)
      return fin, (x_tip, y_tip, z_tip)
      

      =====================================================

      T-СТАБИЛИЗАТОР

      =====================================================

      def create_hstab(x_tip, z_tip):
      cr, ct = 1400, 620
      sh, sw = 2200, 420
      root = naca4(0.12, cr)
      root.translate(Base.Vector(x_tip,0,z_tip))
      tL = naca4(0.12, ct)
      tL.translate(Base.Vector(x_tip+sw,-sh,z_tip))
      tR = naca4(0.12, ct)
      tR.translate(Base.Vector(x_tip+sw, sh,z_tip))
      return Part.makeLoft([tL, root, tR], True, False)

      =====================================================

      ФЮЗЕЛЯЖ

      =====================================================

      def frame(x, w, h, offset):
      pts=[]
      for i in range(61):
      a = 2math.pii/60
      pts.append(Base.Vector(x,(w/2)*math.cos(a), offset+(h/2)*math.sin(a)))
      pts.append(pts[0])
      return Part.Face(Part.makePolygon(pts))

      frames = [frame(x,w,h,o) for x,w,h,o in FUSFRAMES]
      fuselage = Part.makeLoft(frames, True, False)

      =====================================================

      Построение килей

      =====================================================

      kielL, (x_tk, y_tk, z_tk) = create_vstab(-1)
      kielR, = createvstab(1)
      fuselage = fuselage.fuse([kielL,kielR]).removeSplitter()

      =====================================================

      Остальные элементы

      =====================================================

      hstab = create_hstab(x_tk, z_tk)
      canard = create_canard()
      elevator = create_elevator()

      =====================================================

      ВЕНТИЛЯТОРЫ

      =====================================================

      def te_x(y):
      data=[(600,8300),(2800,7500),(4500,6650),(6500,5450)]
      y=abs(y)
      for i in range(len(data)-1):
      y1,x1=data[i]; y2,x2=data[i+1]
      if y1<=y<=y2:
      return x1+(y-y1)*(x2-x1)/(y2-y1)
      return 5450

      fans=[]
      for i in range(12):
      cy = 1600 + i*(5800-1600)/11
      cx = te_x(cy)-400
      pos = Base.Vector(cx,cy,1080)
      outer = Part.makeCylinder(160,600,pos,Base.Vector(1,0,0))
      inner = Part.makeCylinder(145,610,pos,Base.Vector(1,0,0))
      fan = outer.cut(inner)
      fan.rotate(pos, Base.Vector(0,1,0), 15)
      fans.append(fan)

      fansL = Part.makeCompound(fans)
      fansR = fansL.mirror(Base.Vector(0,0,0), Base.Vector(0,1,0))

      =====================================================

      CFD FLUID DOMAIN

      =====================================================

      all_aero = [fuselage, wingL, wingR, canard, elevator, hstab]
      bb_xmin = min(s.BoundBox.XMin for s in all_aero)
      bb_xmax = max(s.BoundBox.XMax for s in all_aero)
      bb_ymin = min(s.BoundBox.YMin for s in all_aero)
      bb_ymax = max(s.BoundBox.YMax for s in all_aero)
      bb_zmin = min(s.BoundBox.ZMin for s in all_aero)
      bb_zmax = max(s.BoundBox.ZMax for s in all_aero)

      domain = Part.makeBox((bb_xmax-bb_xmin)+5000+20000,
      (bb_ymax-bb_ymin)+2*10000,
      (bb_zmax-bb_zmin)+10000+1500,
      Base.Vector(bb_xmin-5000, bb_ymin-10000, bb_zmin-1500))

      fluid_domain = domain.cut(all_aero + [fansL, fansR])

      =====================================================

      ЭКСПОРТ

      =====================================================

      out = "C:/Temp"
      os.makedirs(out, exist_ok=True)
      Part.export([fluid_domain], out+"/TEN_M_V7_fluid_domain.step")
      print("\nSTEP:", out+"/TEN_M_V7_fluid_domain.step")

      =====================================================

      ПОКАЗ

      =====================================================

      def show(shape,name,color,transp=0):
      o = doc.addObject("Part::Feature", name)
      o.Shape = shape
      o.ViewObject.ShapeColor = color
      o.ViewObject.Transparency = transp
      return o

      show(fuselage,"Body",(0.30,0.30,0.35))
      show(wingL,"Wing_L",(0.75,0.75,0.75))
      show(wingR,"Wing_R",(0.75,0.75,0.75))
      show(fansL,"Fans_L",(0.10,0.10,0.10))
      show(fansR,"Fans_R",(0.10,0.10,0.10))
      show(canard,"Canard",(0.70,0.70,0.70))
      show(elevator,"Elevator",(0.50,0.50,0.50))
      show(hstab,"HStab_T",(0.65,0.65,0.65))
      show(fluid_domain,"FluidDomain",(0.20,0.50,0.80),88)

      doc.recompute()
      print("\nTEN_M_V7: ГОТОВО. Киль построен без узелков!")

      Возможно даже кто-то подскажет пути его совершенствования.


Внимание!

Официальный сайт бота по ссылке ниже.

Официальный сайт