Параметрическое моделирование в САПР SolveSpace: «Неисповедимы пути Решателя» или «Червоточины Ньютона»

    На первый взгляд, задача применения размерных ограничений к чертежу кажется не сложнее упражнения из школьного учебника. Точно так же показалось и мне, когда я впервые узнал о ней. В то время я работал в компании, которая занималась разработкой программного комплекса для проектирования индивидуальных жилых домов с подготовкой проектной документации "под ключ". В этом проекте я занимался разработкой алгоритма генерации многоскатных крыш, а впоследствии и всего геометрического ядра на основе Булевых операций, поэтому за дальнейшей историей я следил издалека. В какой-то определенный момент, заказчику захотелось, чтобы проектировщики могли просто указать размеры комнат, углы эркеров и ширину дверных проемов, а программа автоматически рассчитала бы все остальные параметры внешнего и внутреннего устройства дома. Эта мысль возникла у заказчика спонтанно, и поэтому срочно нужно было сделать “точно так же, как в CATIA”. Наш тимлид подошел к решению задачи с энтузиазмом и начал разрабатывать прототип. Он решал сотни уравнений в MathCAD, весь кабинет был завален графиками частных решений для двух, трех, четырех точек… Его изначальное предположение о том, что задачу можно решить аналитически, потерпело фиаско: на дворе был 2005, а это значило, что в интернете невозможно было найти хоть какую-то информацию по данной теме. В результате, после двух месяцев напряженных исследований, данную функциональность пришлось исключить.



    Метод Ньютона


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


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



    Иллюстрация расхождения метода Ньютона, примененного к функции f(x)=x^{3}-2x+2. Возьмём нуль в качестве начального приближения. Первая итерация дает в качестве приближения единицу. В свою очередь, вторая снова дает нуль. Метод зациклится и решение не будет найдено. В общем случае построение последовательности приближений может быть очень запутанным.


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




    Червоточины Ньютона


    Как же победить "Червей Сомнений"?


    Улучшаем сходимость (декомпозиция задачи)


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


    Увеличиваем точность (обусловленность системы уравнений)


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


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


    ax + b = 0.


    Его решение:


    x = -b / a


    Если воспользоваться геометрической интерпретацией, то ax + b — уравнение прямой, а ее пересечение с осью абсцисс и является решением уравнения. Теперь представьте, что исходные данные (a, b) для этого уравнения заданы с некоторой степенью точности. В таком случае, чем меньше величина a, и прямая ближе к параллельности оси абсцисс, тем больше будет неоднозначность решения. При малых относительных изменениях a значения x будут изменяться значительно. Если же мы будем рассматривать систему из многих уравнений, то в ходе решения ошибка может накапливаться, и результат решения будет больше похож на характеристики погодных условий удаленных планет, нежели на верный результат решения системы линейных уравнений. Поэтому очень важным моментом является контроль числа обусловленности системы уравнений и предпринятие ряда мер по приведению системы к такому виду, при котором можно получить наилучшую точность.


    Примером, когда эта проблема может проявляться, может служить несогласованность уравнений по величинам. Например, с помощью геометрических ограничений мы можем создать треугольник, зафиксировав длины двух сторон и угол между ними. Уравнение ограничения длин записывается в миллиметрах, а ограничение угла, например, задается через равенство косинусов. Несогласованность этих величин может служить причиной для реализации различных сценариев потери точности: когда мы делаем небольшие треугольники размера порядка миллиметров — мы можем получать достаточно хорошую точность, но когда начинаем решать те же уравнения, но с длинами порядка километров — мы будем получать совершенно другую относительную точность результата. Это случается потому, что величины длин меняются значительно, при этом значения косинусов углов остаются в неизменном диапазоне значений. Я верю, что одним из вариантов решения проблемы несогласованности уравнений может служить формирование системы уравнений в однородной системе координат, с использованием методов проективной геометрии, но это умозаключение является предчувствием, ввиду моих весьма скромных познаний в области проективной геометрии в частности, да и всей математики в целом. Есть вероятность, что эта тема уже была раскрыта, но возможно, кто-то сможет найти в ней способ защитить пару-тройку диссертаций.


    Увеличиваем производительность


    Алгоритмическая сложность решения системы нелинейных уравнений методом Ньютона в основном определяется сложностью решения системы линейных уравнений. Например, оригинальный SolveSpace по версии Джонатана Вэстхью, автора SolveSpace, в качестве метода решения использует метод Гаусса, обладающий алгоритмической сложностью O(n^3). Это не очень-то быстро, если вдруг захочется решать большие скетчи, содержащие тысячи уравнений и неизвестных. Но учитывая тот факт, что матрица системы линейных уравнений практически вся состоит из нулей и является сильно разреженной, для решения можно применять алгоритмы с более низкой алгоритмической сложностью.


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


    Заключение


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


    Часть 1: Введение
    Часть 2: Эскиз
    Часть 3: Степени свободы и уравнения ограничений
    Часть 4: «Неисповедимы пути Решателя» или «Червоточины Ньютона»

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 28
    • +1

      А не было ли идеи применять другие способы решения многопараметрических уравнений, кроме метода Ньютона? Например, методы Монте-Карло, в частности, метод отжига? Они же прямо просятся сюда.

      • 0
        Алгоритм имитации отжига не гарантирует нахождения минимума функции, однако при правильной политике генерации случайной точки в пространстве X, как правило, происходит улучшение начального приближения.

        Шило на мыло?

        • 0
          Можете раскрыть мысль, что именно не так?
          Одно из преимуществ методов Монте-Карло — простота реализации. В статье вы пишите, что декомпозиция задачи, которую приходится делать для оптимизации — это отдельная аналитическая работа. А результат работы малопригоден если, например, требуется расширить область применения задачи. В случае с ММК, задача легко расширяется на другие области. И можно представить решение не только геометрических уравнений для Эскиза, но и включить в систему уравнений, например, параметр массы. Так чтобы при поиске решения, одновременно решалась задача ее минимизации. Не говоря уже про переход от двухмерных случаев к трехмерным.
          Основная работа, которая проводится при применении ММК, это как раз поиск «правильной политики генерации случайной точки в пространстве Х» и снижение вычислительной сложности решаемой системы уравнений. Но, по моему опыту, даже без серьезной проработки, чаще всего можно получить приемлемый результат за адекватное машинное время.
          Еще одним из преимуществ ММК является легкость массштабирования и распараллеливания вычислений. Учитывая нынешний вектор развития средств вычисления, это актуально.
          Конечно, за все надо платить, и из преимуществ вытекают и недостатки. Основной — потребляемые вычислительные ресурсы. По сути, все ММК, это оптимизированные варианты полного перебора. Тем не менее, инженерные задачи, которые вы описываете, вполне решаемы за приемлемое время.
          • 0
            Одно из преимуществ методов Монте-Карло — простота реализации.

            Пожалуй, соглашусь. Я прочитал вот эту статью https://habrahabr.ru/post/209610/, там все доходчиво описано. Но суть в том, как я понял, что ММК применяют для решения NP сложных задач, например. Поэтому там принципиально не имеет значения, сколько вычислительной мощности ты вкидываешь — это все равно будет меньше, чем полный перебор. Метод же Ньютона при имении начального приближения (грубый чертеж), сходится очень быстро, за малое число итераций. А вот если он не сошелся, или, например, стоит задача без начальных приближений параметров построить чертеж, имея только набор точек и констрейны между ними — вот тогда уже можно начать "кидать кости". Тут я, пожалуй соглашусь, что ММК сделает решение этой задачи возможной. Но тут нужно делать просто так: мы кидаем параметры в случайное положение, решаем сошлось все? готово! иначе — перекидываем кости тех парамеров, замешанных в уравнения, которые не сошлись… короче, делаем что-то. Либо нужно внутри метода Ньютона иногда, с некоторой вероятностью, шагать не в направлении решения, а в произвольном прыжке…


            В статье вы пишите, что декомпозиция задачи, которую приходится делать для оптимизации — это отдельная аналитическая работа. А результат работы малопригоден если, например, требуется расширить область применения задачи.

            Да, но можно не решать задачу декомпозиции, просто забив на нее :) Сейчас есть алгоритмы, которые имеют меньшую вычислительную сложность, работающие на разреженных матрицах.


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

            Тут зависит от того, что рассматривать в качестве "адекватного машинного времени" секунды? минуты? часы? Метод Ньютона работает "realtime" даже на большом количестве ограничений. Мне слабо верится, что от ММК можно добиться такой скорости работы

      • 0
        Я верю, что одним из вариантов решения проблемы несогласованности уравнений может служить формирование системы уравнений в однородной системе координат, с использованием методов проективной геометрии, но это умозаключение является предчувствием

        Мыслите в правильном направлении, но проективная геометрия тут не при чем. Эта проблема решается использованием аффинно-инвариантных методов, таких как метод Ньютона и BFGS. Есть отдельные методы, которые борются только с разной размерностью координат. Самый известный из них, это Adam.

        Вообще решение систем нелинейных уравнений и нелинейная оптимизация — активно развивающаяся область. К примеру, менее чем 10 лет назад, было обнаружено, что задачу посадки на Марс можно свести к выпуклой оптимизации — Minimum-Landing-Error Powered-Descent Guidance for Mars Landing Using Convex Optimization. SpaceX использует что-то похожее для более сложной задачи посадки ракет на Землю — Autonomous Precision Landing of Space Rockets (статья начинается на 15 странице), но деталей, к сожалению, не раскрывает.

        Из Open Source библиотек решения нелинейных уравнений советую глянуть на проект со странным названием COIN-OR. Еще есть проприетарная библиотека SNOPT, но есть открытое описание используемого там алгоритма. Для выпуклых задач есть CVX, CVXPY, CVXOPT и CVXGEN.

        Из книжек мне понравилась Convex Optimization. Stephen Boyd and Lieven Vandenberghe. Для общего случая нелинейной оптимизации/решения систем нелинейных уравнений я пока читал только разрозненные статьи.
        • 0

          Спасибо большое за ссылки. Если уж продолжать о предчувствиях, то мое воображение иногда рисует картинки, на которых изображены миллион-ядерные чипы, каждое ядро которого — аппаратная реализация метода Ньютона (или чего-то такого). Ну а используются они… Правильно, для аппроксимации многомерных функций (читай: обучения нейронных сетей). Только все это галлюцинации, в эту тему я пока не вник.

        • +2
          Просто хочу сказать спасибо всем авторам SolveSpace и статей про него за их работу. Это единственный CAD, который я смог осилить, потому что он понятный и логичный.
          • +1
            общем случае сводится к решению системы нелинейных уравнений, которую в аналитической форме современные математики решать не умеют

            Вот так проснешься с утра, и понимаешь, что последние 19 лет занимался тем, чего быть не может.
            Автор, погуглите по ключевым словам: «Grobner basis», «involutive basis», «lexicographic Grobner basis». Вычисление этих базисов последние 50+ лет спокойно решает данную задачу.
            • 0

              Да, конечно же я в курсе про эти базисы Грёбнера. Только вот насколько я помню, там есть некоторые ограничения. Там вроде только полиномы раскладываются на них, а произвольные функции… Мне сложно представить, как это возможно. Хотя, что уж там, и про полиномы мне представить не проще. Но я был бы вам благодарен, если бы вы дали свою краткую характеристику на эту тему, мне было бы очень интересно понять, насколько реально реализовать, скажем подобный решатель геометрических ограничений с использованием этого метода. Если необходимо, я предоставлю дополнительную информацию, хотя примерно о типе уравнений можно судить по предыдущей статье.

              • 0
                Одним из традиционных применений этих базисов является задача прямой/обратной кинематики (построить область достижимости манипулятора с n-звеньями, например). По крайней мере, все уравнения из прошлой части можно (насколько я понимаю) выразить в полиномиальном виде. Правда теоретическая сложность решения не будет радовать, двойная экспонента от числа переменных, если грубо сказать.
                Я в ближайший месяц в отпуске, если интересно — можете прислать какую нибудь типичную систему уравнений для задачи, попробую решить. Тем более бенчмарк лишний мне не помешает ;).
                Ну и поддерживаю предыдущих комментаторов, методы, использующий многогранники Ньютона (convex hull и т.д.) тоже вполне применимы, но там численное решение ищется, если я не ошибаюсь.
                • 0
                  Правда теоретическая сложность решения не будет радовать, двойная экспонента от числа переменных, если грубо сказать.

                  Даже не знаю, как тут оценить. С одной стороны, мы тратим много времени (двойная экспонента — это как?). С другой стороны, мы получает аналитически-точное решение (В каком виде?). Т.е. больше нам ничего вычислять не надо, мы (грубо говоря) получили f(p0...px) — векторную функцию (значения неизвестных параметров) от векторного аргумента (степени свободы). Можем крутить ее, быстро вычисляя результат. Я тут даже не понимаю, с какой стороны подойти, я когда все это читал, вообще не понял, в каком виде я хотел бы получить ответ от этой штуки. Исходная задача обычно формулируется так: есть несколько неизвестных, которые мы считаем координатам точек, и есть уравнения в символьном виде, которые их связывают (в основном, теорема Пифагора для длин, равенство скалярного произведения для углов). Мне было бы очень интересно посмотреть, как это считается для построения достижимой области для простого манипулятора, т.к. я даже не понимаю, что следует ожидать от этого метода, и чего не следует.

                  • 0
                    Заметки одного конкурента, на второй странице описана проблема инверсной кинематики. И, должен сказать, этот автор написал неплохую программу для решения систем нелинейных уравнений.
                    Достижимую область считают расщеплением системы уравнений, полученных похожим образом (учитывают допустимые углы и т.п.). Я математик, так что обычно считаю те системы, что мне дают :), мое мнение о методах их получения чисто непрофессиональное, сорри.
                    • 0
                      Да, я понимаю, что такое инверсная кинематика. Только дальше говорится снова о методе Ньютона, а если он задавал все уравнения через синусы, косинусы — там вообще все шикарно работать должно. Уравнения ограничений можно представить множеством способов, какие-то будут лучше работать, какие-то хуже. А мне интересно это именно в контексте базисов Грёбнера, понять, что есть решение системы и как его применить на практике, как с помощью него решать задачу инверсной кинематики в условиях, когда точного решения нет (передвижения элементов чертежа мышью, в том числе и за пределы достижимых значений)
                      • 0
                        Решением будет система уравнений специального вида — одно уравнение будет зависеть только от одной переменной (если решений конечное число) ну или задавать соотношение между несколькими переменными (если их бесконечное число). Остальные уравнения системы будут разрешаться через него — примерно как в обратном ходе метода Гаусса.
                        Например, взяв в задаче обратной кинематики длину первого звена = 1 и второго = 2, получим следующую систему, из которой можно определить углы, под которыми надо повернуть звенья, чтоб достичь точки (p1, p2):
                        j[1]=16*s2^2+(p1^4+2*p1^2*p2^2-10*p1^2+p2^4-10*p2^2+9)
                        j[2]=(2*p1^2+2*p2^2)*s1+(4*p1)*s2+(-p1^2*p2-p2^3+3*p2)
                        j[3]=4*c2+(-p1^2-p2^2+5)
                        j[4]=3*c1+(-2*p1)*c2+4*s1*s2+(-2*p2)*s2+(p1)

                        Из первого уравнения получим значение синуса второго угла, причем алгебраически точное, а не приближенное и т.п. Таким образом зафиксировав длины звеньев решаем систему, а потом таская точку мышкой можно звенья отрисовать :).
                        Естественно, если модуль синуса получился больше единицы, и у нас не военное время, то мы данной точки не достигнем ;)
                        • 0
                          > под которыми надо повернуть звенья, чтоб достичь точки (p1, p2):

                          Да, я понимаю. А если вдруг нам надо таскать за другую точку, нам опять все уравнения перерешивать. Хотя я даже не понимаю, зачем их решать, ведь можно просто записать их, начиная от этой точки.
                          • 0
                            И получится параметрия, как в flexcad. только автоматизировать надо «хождение по графам». хотя циклы все же станут системами уравнений.
            • 0
              Хороший САПР.
              Кстати, как дилетант использования подобных приложений:
              1. Подходит ли для проектирования каркасного дома (и из любых других материалов)
              2. Подходит ли для проектирования станков и автоматизации
              3. Готовую модель для визуализации куда лучше переносить
              • 0
                1. Думаю, с этой проблемой SolveSpace справится без проблем. Я имею ввиду, сделать разметку досок, панелей и прочее. Солвер и массивы в режиме assembly тут вытаскивают.
                2. Несложные механические детали можно (например, детали 3d принтера или CNC-станка), сборки, моделирование механики — без проблем. Единственное, что сейчас является проблемой — это моделирование сложных поверхностей (скругления, фаски, заметание, резьба и т. д.)
                3. Готовую модель можно гнать через obj или stl в Blender, например, да куда угодно. Есть даже экспорт в STEP, но он неясно насколько хорошо работает. Есть еще вариант сразу записывать pdf или svg, можно делать чертежи сборочные и т. д. Есть экспорт на web-страницу в качестве интерактивной 3d модели
                • 0
                  те я правильно понимаю — я могу запроектировать в нем строительство своего мини-цеха, размещение в нем всего оборудования и само оборудование и смоделировать по сути работу и производство конечных деталей… те весь цикл по сути (считай каркасное домостроение + из остатков отходов проста тара и др изделия).
                  фактически привязать к этому уже бизнес-процессы и будет все у меня документация :) верно? в добавок на все CNC сразу же и нужные модельки
                  • 0

                    Ну вы описали явно систему, выходящую за рамки этой программы. Что вы описали — это сейчас называют модными словами BIM и PLM. Это вам нужно к лидерам рынка обращаться (однажды я работал в таком стартапе, но фирма лопнула). SolveSpace — это не более, чем программа моделирования простейших деталек для 3д печати, огромные промышенные сборки она не потянет (пока в нее развитие кто-нибудь не вложит много денег, примеры есть).

                    • 0
                      я для мини производства рассматриваю инструмент уровня ИП. Максимально все проработав. Автокад слишком тяжел и не хочу крякнутый использовать
                      • 0

                        В таком случае, только попробовав что-то небольшое реализовать на этой программе, можно взвесить все "за" и "против".

                        • 0
                          был в мегапроектах разных… понимаю, что трудозатраты там высокие
                          скетчап рассматриваю как игрушку пожалуй
                          • 0

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

                • +1
                  >Подходит ли для проектирования каркасного дома (и из любых других материалов)
                  Вполне подойдет, вот только нужно будет снижать кол-во треугольников иначе начинаются жесткие тормоза (по крайне-мере в линуксе). Да даже когда снизишь их кол-во всё равно тормоза, даже на простейшей модели (в реальном масштабе). Может в окошках по другому, попробуйте.

                  >Подходит ли для проектирования станков и автоматизации
                  Подходит, но придется столкнуться с костылями в виде создания 2D каркаса нужной вам механики и цепляние на этот каркас деталей в 3D, причем иногда параметрический решатель не хочется их цеплять и постоянно ругается. Но если набить руку, можно научиться обходить эти проблемы. И опять же жесткие тормоза, когда пытаешься подвигать созданную механику в 3D. Но опять же — линукс, за винды не скажу.

                  В целом, мне программа нравится своей миниатюрностью, простотой и нативной работой в линуксе, если бы я сидел на виндах, то скорее всего спиратил SolidWorks.

                  Но недавно нашел вот такое решение www.tflexcad.ru/download/t-flex-cad-free С первого взгляда очень понравилось. Плюс возможность загрузить бесплатную версию для некоммерческих целей. А для коммерческих она также стоит вполне разумных денег.
                  • 0
                    О, интересно. А то до этого я в скетче баловался и автокад по работе был.
                    • 0
                      SolveSpace скорее для любителя, который впервые столкнулся с подобными системами и не желающий тратить кучу времени на изучение их работы. Так что с вашими профессиональными знаниями автокада вам бы вряд ли понравилось работать с SolveSpace.

                      Например, я перешел на SolveSpace из Tinkercad, т.к. мне потребовалась относительно сложная механика и как оказалось в SolveSpace многие вещи делать гораздо проще, чем в Tinkercad. Так что если кому-то нужно именно что-то уровня Tinkerpad, то SolveSpace просто идеальный выбор.
                    • 0
                      Но недавно нашел вот такое решение www.tflexcad.ru/download/t-flex-cad-free

                      Да, очень милый факт: у них даже решателя нет в том виде, в котором я о нем говорю. А делать можно все!

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.