Система скриптового 3д моделирования ZenCad

    Та работа, которую я хочу представить вашему вниманию, есть попытка еще раз написать систему скриптового 3д моделирования. Написать так, как я её хотел бы видеть.


    Рецепт системы ZenCad довольно прост. Концепт скриптового 3д моделирования OpenScad, геометрическое ядро OpenCascade, python3 в качестве клея, библиотека ленивых вычислений evalcache для агресивного кеширования вычислений. Добавить специй еще из пары-тройки инструментов, приправить gui под соусом PyQt, и подать к столу перемешав, но не взбалтывая.


    машинка.пнг


    Скриптовые CAD системы


    CAD, или по нашему САПР, есть система автоматизированного проектирования. В отличии от интерактивных 3д редакторов скриптовые CAD системы трактуют слово "автоматизированое" в том значении, в котором обычно понимают его создатели програмного обеспечения. Тоесть не как набор вычислительных инструментов, но как кристально чистый алгоритм, требующий вмешательства человека лишь в момент его создания.


    Работая в скриптовом CAD мы не рисуем модель непосредственно на экране, но выстраиваем программу, согласно которой генерируется модель. Для людей, знакомых только с интерактивными CAD, этот подход можно описать как возведенное в абсолют параметрическое моделирование. Строго говоря, скрипты часто применяются для дополнения интерактивной среды, для написания дополнительных инструментов, но работа в парадигмально чистом скриптовом CAD требует другой организации рабочего процесса, образа мысли и расчитана на несколько отличный круг задач.


    Самым известным и чистым скриптовым CAD на текущий момент является OpenScad.


    В начале был OpenScad


    Есть определенный круг людей, кто предпочитает удобному Компасу, SolidWorks, FreeCad приземлённый и неприхотливый OpenScad. Довольно непросто ответить на вопрос в чем секрет его успеха, но точно можно сказать, что он лёгок, достаточно гибок в использовании, имеет минимум настроек. Части моделей, написанных на нем легко переиспользовать.


    Однако, у openscad есть несколько обидных недостатков:


    • openscad работает только с mesh сетью.
    • openscad имеет довольно низкий предел масштабируемости, начинает сильно лагать на больших моделях.
    • openscad довольно сложно интегрировать с другими системами, причиной чему использование собственного языка.

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


    Язык и все-все-все


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


    Сравнение графических интерфейсов ZenCad и OpenScad

    Интерфейс ZenCad:
    zencad.png


    Интерфейс OpenScad:
    openscad.png


    Применение python позволяет упростить код openscad, сделав код модели прозрачнее в сравнении с OpenScad.


    Пример: CSG
    #!/usr/bin/env python
    #coding: utf-8
    
    from zencad import *
    lazy.diag = True
    
    c1 = 100
    c2 = 130
    c3 = c2/2 + 20
    
    base = box(c1,c1,c1,center=True)
    
    f1 = ngon(r = 35, n = 3)
    f2 = ngon(r = 35, n = 5)
    f3 = circle(35)
    
    s1 = linear_extrude(f1, c2, center=True)
    s2 = linear_extrude(f2, c2, center=True).rotateY(deg(90))
    s3 = linear_extrude(f3, c2, center=True).rotateX(deg(90))
    
    # Обратите внимание на применение операторов к булевым операциям над 3д телами.
    m1 = base - s1 - s2 - s3
    m2 = base ^ s1 ^ s2 ^ s3
    m3 = s1 + s2 + s3
    
    ystep = 240
    xstep = 240
    
    fontpath = os.path.join(zencad.moduledir, "examples/fonts/testfont.ttf")
    
    # Надписи являются обычными объектами. К ним применимы все стандартные операции.
    t1 = textshape("difference", fontpath, 40)
    t1c = t1.center()
    t1=t1.translate(-t1c.x, -t1c.y, 0).rotateZ(deg(45))
    
    t2 = textshape("intersect", fontpath, 40)
    t2c = t2.center()
    t2=t2.translate(-t2c.x, -t2c.y, 0).rotateZ(deg(45))
    
    t3 = textshape("union", fontpath, 40)
    t3c = t3.center()
    t3=t3.translate(-t3c.x, -t3c.y, 0).rotateZ(deg(45))
    
    # И наконец, размечаем сцену.
    disp(base.forw(ystep))
    
    disp(s1)
    disp(s2.left(xstep))
    disp(s3.right(xstep))
    
    disp(m1.back(ystep))
    disp(m2.left(xstep).back(ystep))
    disp(m3.right(xstep).back(ystep))
    
    disp(t1.back(ystep).up(c3), Color(1,1,0))
    disp(t2.left(xstep).back(ystep).up(c3), Color(1,1,0))
    disp(t3.right(xstep).back(ystep).up(c3), Color(1,1,0))
    
    disp(s1.left(xstep).back(ystep), Color(0.5,0,0,0.95))
    disp(s2.left(xstep).back(ystep), Color(0.5,0,0,0.95))
    disp(s3.left(xstep).back(ystep), Color(0.5,0,0,0.95))
    
    disp(s1.back(ystep), Color(0.5,0,0,0.95))
    disp(s2.back(ystep), Color(0.5,0,0,0.95))
    disp(s3.back(ystep), Color(0.5,0,0,0.95))
    
    show()

    boolean.png


    Очень удобно, например, фильтровать облако точек с применением синтаксиса генераторов.


    Пример: Фильтрация массива точек.
    #!/usr/bin/env python3
    from zencad import *
    
    # Строим шестиугольник.
    ng = ngon(r = 10, n = 6)
    
    # Получаем его вершины и фильтруем нужные.
    vertices = ng.vertices()
    filtered_vertices = [v for v in vertices if v.x < 0]
    
    # Применяем операцию скругления в полученных вершинах.
    m = ng.fillet(4, filtered_vertices)
    
    disp(m)
    show()

    ngon


    Благодаря python, неофициально занимающему в современной програмной экосистеме титул короля клея, zencad легко интегрируется с другими библиотеками и програмными комплексами. Мы можем в одном скрипте использовать sympy для генерации аналитической поверхности, numpy для обработки сгенерированного по этой поверхности облака точек и, конечно же, zencad для построения, визуализации и постобработки.


    Пример: Простое построения поверхности по точкам
    from zencad import *
    import numpy
    
    xcoords = numpy.linspace(-10,10,50)
    ycoords = numpy.linspace(-10,15,50)
    
    lines = [ interpolate([point(x, y, 0.01*(x**2 + y**3)) for x in xcoords]) for y in ycoords ]
    
    wires = []
    
    for l in lines:
        trans = translate(0,0,-30)
        sf = l.endpoints()
        w=sew([l, segment(sf[0], trans(sf[0])), trans(l), segment(sf[1], trans(sf[1]))])
        wires.append(w)
    
    for l in lines:
        disp(l.left(30))
    
    disp(loft(wires) - halfspace().down(10))
    
    show()

    chair.png


    Прочный фундамент OpenCascade


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


    Таким образом, второй точкой внедрения является использование полноценного геометрического ядра, использующего граничное представление вместо мешсетевой модели. Построенный вокруг хакерского геометрического ядра OpenCascade, ZenCad, конечно же, не ставит целью предоставить полноту его возможностей в среде python. Попытка в полной мере передать OpenCascade, привела бы к написанию второго pythonOCC. ZenCad берет по верхам, стараясь сохранить баланс между функциональностью и эргономичностью.


    Пример: Програмная бутылка OpenCascade воспроизведенная в среде ZenCad
    #!/usr/bin/env python3
    #coding: utf-8
    
    from zencad import *
    import zencad.surface as surface
    import zencad.curve2 as curve2
    lazy.diag=True
    
    height = 70
    width = 50
    thickness = 30
    
    # BASE
    pnt1 = point(-width/2,0,0);
    pnt2 = point(-width/2,-thickness/4,0);
    pnt3 = point(0,-thickness/2,0);
    pnt4 = point(width/2,-thickness/4,0);
    pnt5 = point(width/2,0,0);
    
    edge1 = segment(pnt1, pnt2)
    edge2 = circle_arc(pnt2, pnt3, pnt4)
    edge3 = segment(pnt4, pnt5)
    
    wire = sew([edge1, edge2, edge3])
    profile = sew([wire, wire.mirrorX()])
    body = profile.fill().extrude(height)
    body = fillet(body, thickness/12)
    hl(body.forw(140))
    
    # NECK
    neck_radius = thickness/4.;
    neck_height = height/10;
    neck = cylinder(r=neck_radius, h=neck_height).up(height)
    body = body + neck
    hl(body.forw(100))
    
    # THICK
    body = thicksolid(body, -thickness / 50, [point(0,0,height+height/10)])
    hl(body.forw(60))
    
    # THREAD (Поддержка 2д кривых на поверхностях сейчас в экспериментальном режиме.)
    cylsurf1 = surface.cylinder(neck_radius * 0.99)
    cylsurf2 = surface.cylinder(neck_radius * 1.05)
    
    major = 2 * math.pi;
    minor = neck_height / 10;
    angle = math.atan2(neck_height / 4, 2 * math.pi)
    
    ellipse1 =  curve2.ellipse(major, minor).rotate(angle)
    arc1 =      cylsurf1.map(curve2.trimmed_curve2(ellipse1, 0, math.pi))
    segment1 =  cylsurf1.map(curve2.segment(ellipse1.value(0), ellipse1.value(math.pi)))
    
    ellipse2 =  curve2.ellipse(major, minor/4).rotate(angle)
    arc2 =      cylsurf2.map(curve2.trimmed_curve2(ellipse2, 0, math.pi))
    segment2 =  cylsurf2.map(curve2.segment(ellipse2.value(0), ellipse2.value(math.pi)))
    
    m1 = sew([arc1, segment1])
    m2 = sew([arc2, segment2])
    thread = loft([m1, m2]).up(height + neck_height / 2)
    
    hl(m1.up(height + neck_height / 2).right(80))
    hl(m2.up(height + neck_height / 2).right(60))
    hl(thread.right(40))
    
    # FINAL
    m = thread + body
    
    display(m)
    show()

    bottle.png


    Преемственность традиции. Начало координат как исток всего


    Синтаксические решения zencad, по примеру его старшего брата и учителя OpenScad, минимизируют количество сущностей в библиотеке. Как и OpenScad, ZenCad принципиально не умеет создавать примитив в точке (x,y,z), несмотря на то, что OpenCascade это позволяет. ZenCad сначала создает примитив в начале координат, после чего задает необходимое ему положение, применяя преобразования. Преобразования в ZenCad существуют и как отдельные объекты и как методы тел.


    # Синтаксис методов.
    cube(40, center=True).rotateX(deg(45)).rotateZ(deg(45)).right(20)
    
    # Синтаксис объектов.
    (right(20) * rotateZ(deg(45)) * rotateX(deg(45)))(cube(40, center=True))
    
    # Или так.
    trans = right(20) * rotateZ(deg(45)) * rotateX(deg(45))
    cube(40, center=True).transform(trans)

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


    Лень


    С целью минимизации времени вычислений, математика в ZenCad ленифицирована, а все вычисления агрессивно закешированы. Управление алгоритмами ленификации берет на себя [del]блокчейн[/del] библиотека evalcache, о которой я рассказывал на страницах Хабрахабра некоторое время назад: Дисковое кеширование деревьев ленивых вычислений. Результаты расчетов zencad сохраняет в общем кеше, состояние которого можно отслеживать через интерфейс визуализатора. Используемый хеш-алгоритм sha512 с очешуенной избыточностью исключают возможность коллизий хешключей ленивых объектов (Пространство хэша в 10^74 раз больше количества атомов во вселенной).


    Данная модель при создании генерирует четыре мегабайта геометрии и при первом проходе может вычисляться довольно продолжительное время:


    bolt.png


    Работа с резьбовыми поверхностями вычислительно накладна:


    logo.png


    Проблема рефлексии топологии. Метод ближней точки


    У OpenScad нет операций взятия фаски или скругления. OpenCascade же их предоставляет. Это очень важные операции, и было бы обидно не взять их на вооружения для ZenCad. Есть и другие операции, требующие указания топологического объекта, например, операция взятия тонкостенной модели в примере с бутылкой OpenCascade. В графической CAD системе мы указываем топологический объект (ребро, грань, вершину) мышкой. При написании скрипта такой возможности у нас нет. Нативный OpenCascade решает задачу рефлексией и использует ее для работы с графическими CAD. Хотя ZenCad поддерживает рефлексию по модели, использование ее в качестве основного инструмента имеет ряд значительных недостатков. Во первых, резко увеличивается уровень знаний, необходимый для использования этих инструментов, ибо вы как минимум должны понимать внутреннее топологическое представление. Во вторых, как только в скрипте появляется if, сразу ломается стройность ленивых алгоритмов, а так же довольно существенно усложняется код модели. В процессе довольно длительного раздумья и экспериментов, я остановился на методе ближней точки. Если кратко, при выполнении топологически зависимых операций программа обходит объект и находит ближний к заданной точке топологический объект из числа входящих в тело. Этот объект считается выбранным. Такое решение более затратно вычислительно, но, благодаря кешированию, показывает себя неплохо. Такой подход применяется для всех операций, зависящих от элементов топологии.


    Как уже сказано выше, возможность рефлексии модели, по здравому размышлению, также сохранена, как это уже показано в примере выше (Пример: Фильтрация массива точек).


    Маркер Q и Маркер W


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


    markers


    Отслеживание обновлений источника


    Как и старший брат (OpenScad), ZenCad способен обновлять генерируемую модель при модификации файла источника. В сочетании с системой кеширования, это позволяет довольно комфортно модифицировать скрипт, имея перед глазами практически в реальном времени изменяющееся состояние изделия.


    Анимация


    На этом достоинства zencad не заканчиваются.


    ZenCad (спасибо шустрому ядру opencascade) умеет в реальном времени перерисовывать сцену, что позволяет анимировать 3д модель. Анимация реализуется обыкновенной функцией python и позволяет довольно вольно с собой обращаться. Учитывая, что мы находимся в среде python, zencad оказывается способен визуализировать в виде перемещений моделей данные из внешних источников (Например, с использованием multithreading + tcpsocket). Таким образом zencad может использоваться, например, для полунатурного тестирования робототехнических изделий. О, привет Gazebo!!! Привет ROS!!! Приятно видеть, что вы тоже в зрительном зале. Библиотека кинематики, которая существенно упростила бы построение кинематических цепей роботов манипуляторов, кстати говоря, в разработке.


    Анимация на текущий момент всё еще в полуэкспериментальном варианте (особенно в части управления камерой) так что подробно останавливаться на ней не буду.


    Экспорт — импорт


    На текущий момент поддерживается экспорт и импорт в формате brep, что позволяет интегрироваться с freecad и экспорт в формате stl, что позволяет генерировать модели для 3д печати. Также поддерживается генерация скриншотов. В том числе автоматическая. В частности, скриншоты в онлайн мануале генерируются силами ZenCad в автоматическом режиме.


    Текущее состояние


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


    Библиотека доступна в pipy для Debian совместимых осей с версиями языка python3.5, python3.6, python3.7


    (Возможно, понадобится установить qt5-default, из-за каких-то проблем с плагинами у PyQt5)


    python3 -m pip install zencad 
    apt install qt5-default

    Запуск gui из командной строки:


    python3 -m zencad 

    Запуск gui из python скрипта:


    #!/usr/bin/env python3
    
    import zencad
    
    m = zencad.cube(20)
    zencad.disp(m)
    
    zencad.show()
    

    К сожалению, прогресс системы идет не так быстро, как хотелось бы. Еще не реализована большая часть апи двумерной геометрии и апи работы с поверхностями, поддержка экспорта и импорта стандартных форматов, не всегда прозрачна обработка ошибок, не проработано автоматическое тестирование, задуманы и пока не реализованы библиотеки для построения резьбовых соединений и шестереночных изделий. В качестве внешнего редактора, что совершенно ненормально, внезапно захардкожен!!! Sublime Text… Также очень хочется доработать систему с тем, чтобы можно было запустить её под Windows (это требует довольно объёмной экспертно-разведывательной работы).


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


    Ссылки на проект


    github: https://github.com/mirmik/zencad, https://github.com/mirmik/servoce


    pypi: https://pypi.org/project/zencad/, https://pypi.org/project/pyservoce/


    manual


    Спасибо за внимание.


    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 56

      0
      Очень интересная библиотека. Жаль, что под windows не работает. Очень бы хотелось попробовать, хотя бы для моделирования простых объектов, пусть даже без анимации.
        +2
        Думаю, разработка windows версии на текущий момент в приоритете. Проект достаточно неплох, чтобы предложить его широкому кругу пользователей. Понятно, что без windows версии широкого распространения пока ждать не приходится. Так что над windows версией буду работать.

        Вообще, изначально я собирался писать статью уже после проработки windows версии. Но там еще непочатый край работы, а лайки хочется собрать уже сейчас…
          0
          Большое спасибо за ваш труд, действительно интересно.
          P.S.: думаю за такую работу лайки не заставят себя ждать :)
            +1
            Понятно, что без windows версии широкого распространения пока ждать не приходится

            Пока Вы не погрузились с головой в Windows-версию, предлагаю подумать вот над чем:
            1. У вас в статье есть ответы на вопросы из серии «как?», но нет ответа на вопрос «зачем?»
            2. Вы — как программист — делаете проект, который гарантированно «соберёт лайки» от программистов. Но CADами-то пользуются конструктора. Что Вы можете предложить конструктору, чего нет у конкурентов, и нужно ли это ему вообще?

            P.S: Лучший на мой взгляд конструкторский САПР (и мировой стандарт де-факто) — это SolidWorks от Dassault Systemes. Dassault — это не только программисты. Это большая фирма, помимо софта ещё разрабатывают и производят… настоящие самолёты. Они знают, какие фичи нужны конструкторам и пилят именно их. Собрать лайки за ещё один, уж простите за прямоту, «недоCAD» — круто. В одиночку — ещё круче. Я так не смогу. Но даст ли это Вам нужное количество денег/признания, относительно трудозатрат?

            И да, плюсов Вам поставил :)
              +1
              Ну, это в первую очередь инструмент, которым пользуюсь я сам.
              Вон вчера краники на смесители напечатал :).
                0
                Есть ли возможность сделать экспорт в форматы, поддерживаемые движком Godot?
                  0
                  Какие?
                    0
                    DAE, OBJ и GLTF 2.0
                      0
                      Правильный ответ тут такой:
                      У нас есть открытый код freecad, который построен вокруг того же ядра. FreeCad позволяет экспорт в DAE и OBJ. Насчет GLTF я не понял.

                      Значит я теоретически могу посмотреть, как эта конверсия выполнена во FreeCad и сделать тоже самое.

                      Так что да. Возможность есть.
                        0
                        Есть ли в в планах по развитию проекта реализация экспорта в эти форматы?
                          0
                          В планах есть реализация экспорта во все форматы, до которых я смогу дотянуться. Раз уж об этих зашла речь, они займут место где-то в начале очереди.
          +1
          Счастлив сообщить, что тестовая виндовая сборка доступна.
          github.com/mirmik/zencad/releases/tag/wintest

          Это пока не релиз, но пощупать можно.
          Работает standalone (ничего дополнительно ставить не надо). Протестировано (Ну, типо падает не сразу) на десятке.

          Качать zip, запускать ZenCad.exe

          (Пока x64 только)
            0
            На семерке 64 идут тестовые примеры. Дальше будем разбираться, например сплайн из 1000 и более точек.

            Про сопряжения можно добавить.

            При прямом, синхронном и компоновочном проектировании про сопряжения не вспоминают. Предполагается что нужно сразу знать, что хочешь получить. Если например в Компасе на чертеже видно, что деталь нужно подвинуть на 0.1, двигаем в исходном документе и все будет по нулям.

            Есть исходные размеры и все остальные получаются в результате вычислений.

            В T-Flex есть опорные элементы, вокруг которых все строится. Изменили опорный элемент, все перестроилось.

            Это еще похоже на библиотеки, задали входные параметры и получили, может даже и целый кран.
            drive.google.com/open?id=0B63y14wkcLqgNlVMZ0w4R0o0RVE

            Результаты проектирования можно передавать сразу на станок

              0
              Сопряжения уже практически добавлены.
              Их надо только облагородить, выбрать окончательный вариант апи и внести в документацию…

              См. пример robot.py
                0
                Про сопряжения немного после, вначале код с векторами, которые можно складывать как вектора. В примерах везде числа, а в коде robot.py параметр управления идет с анимации.
                 #!/usr/bin/env python3
                # coding: utf-8
                
                from zencad import *
                import numpy as np
                
                
                test_mode()
                
                for n in range(1,5,1):
                    d=12+n
                
                    a=np.array([0,  0, 0])
                    b=np.array([0, 20, d])
                    c=np.array([0, 12, d])
                    
                
                
                    pnts  = points([a, b])
                    pnts2 = points([a+c, b])
                
                    m0 = polysegment(pnts)
                    m2 = polysegment(pnts2)
                
                    display(m0)
                    display(m2)
                
                
                
                show()
                   


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

                В Компасе сопряжения понимают как совместить две плоскости любой ориентации. Здесь приходится все пересчитывать и бывают сопряжения несовместимы. Можно добавить одну деталь, включить сопряжение, все сопряжения начинают пересчитываться и бывает что можно потерять сборку.

                В Компасе можно применить только совпадение Локальных Систем Координат (ЛСК).
                При этом уравнения не считаются, просто поворачивают до совпадения ЛСК двух деталей. ЛСК в деталях нужно предварительно построить и задать имя ЛСК.

                Про имя ЛСК можно остановиться подробней, потому что если правильно задать имя, проектирование можно считать выполненным.

                Даже если есть правильное имя ЛСК, вручную буковки в дереве построения искать очень напрягает. А по полученному списку всех ЛСК, программе только за радость сравнить и включить совпадение выбранных ЛСК.

                Пример. На сборочный чертеж поместили мотор, имеющий четыре отверстия для крепления. На каждом отверстии стоит ЛСК с именем «Хочу Болт 10 с шайбами».

                В базе должны быть перечни всех ЛСК по каждой детали.
                Ищем «Кому Болт 10 с шайбами».

                По имени находим в базе нужную ЛСК, загружаем в сборку деталь «Болт с шайбами» и включаем совпадение ЛСК. Все, болт на месте. И т.д.

                Это в Компасе, а ZenCad нужно еще изучать.
                  +1
                  Я думаю, в конечном итоге zencad тоже будет сопрягать два изделия, совмещая определенные ЛСК (собственно, он уже почти так делает). Но конечно, вместо названий будет прямое указание, что и куда ставить. Названия — это не для скриптов.

                  По поводу np.array: В дальнейшем я вообще постараюсь убрать или спрятать поглубже слассы vector и point. Будем как раз с np.array работать. Мне кажется, это в духе питона и удобно для использования стороннего софта.
          0

          Простые модели — не всегда интересно. А можно примеры сборок, да ещё и перестраиваемых?))
          Ну или хотя бы примеры кода с взаимосвязями (сопряжения) тел в модели.


          А в целом — этого мне не хватало лет 5 назад очень сильно.

            0

            Не совсем понял про сопряжения…
            В примерах, которые идут с библиотекой есть такой пример:
            Organizer


            Вот результат работы этого примера:


            Также можно посмотреть сюда:
            Zippo


            Это модель моего 4-х колёсного робота, представленного на первом скриншоте.

              0
              Вообще, сопряжения как таковые тут не прописываются.
              Всё делается за счет правильно расчитанных цепочек размеров. Этим же обеспечивается параметризуемость и перестраиваемость.
            +1
            Интересный проект. Есть ли возможность записать и выложить небольшое ознакомительное видео?
              0
              Мне эта идея в голову не приходила. Если найдётся время…
              0
              1. Как пользователь OpenScad, Python, а также FreeCAD и Blender с радостью узнал о новой библиотеке. С другой стороны возникло опасение, а не возникнет ли хаоса в этой экосистеме. FreeCAD использует и OpenScad и Python, но свои библиотеки. Blender тоже использует Python, но свои библиотеки. Все что-то развивают независимо друг от друга, в итоге растёт зоопарк и не понятно на что ориентироваться.
              2. И ещё одно соображение — САПР это не только движок, но ещё и набор типовых элементов — крепежа, подшипников, зубчатых передач, резьб. И возможность сгенерировать комплект конструкторской документации — двумерные чертежи. Поэтому FreeCAD — это полноценный САПР. А OpenSCAD, ZenCAD и Blender это средства 3-мерного моделирования, но для инженерной работы они не пригодны, или пригодны условно.
                0
                Правильный или неправильный, полноценный или неполноценный САПР, это уж как кому нравится. ZenCad в комплект конструкторской документации уметь не собирается. Это не его задача. Зубчатые передачи и резьбы планируются, но не как готовые элементы, а скорее как набор библиотечных функций.

                Я прорабатывал вопрос интеграции с FreeCad… Пока вызвать силами FreeCad скрипт zencad без некоторой головной боли не получается, но можно использовать brep файлы для передачи геометрии.

                Blender и FreeCad используют python как расширяющую часть своего движка. И хотя тот же FreeCad можно использовать без графического интерфейса, полноценно писать модели на нем скриптами врядли получится.

                В целом, думаю, ответ нет. Та ниша, на которую нацелен zencad не пересекает ареал обитания не Blender, ни FreeCad. Задача ZenCad в том, чтобы писать параметризуемые модели без лишней головной боли. Да, ZenCad напрямую конкурирует с OpenScad. Это естественно, так как он является попыткой преодолеть недостатки OpenScad. Очень условно конфликтует с pythonOCC — тут явно разные цели. Крайне условно с solidpython… (В силу убогости концепта последнего, да простят меня его разработчики...).

                Вообще, вопрос хаоса всегда решается проработанными интерфейсами. Тогда получается не хаос, а живая экосистема, где каждая библиотека занимается своей частью работы. Тот же pythonOCC имеет интерфейс к FreeCad. Если так получится, что zencad получит сколь-нибудь значительную популярность, можно будет попробовать заполучить во FreeCad интерфейс и для ZenCad. (Мне сейчас в голову пришла мысль, что возможно удасться подсунуть геометрию из ZenCad в интерфейс для pythonOCC. Было бы удобно.)…
                  +1
                  Вы со мной не согласитесь, но идея чисто скриптового САПРа изначально ориентирована на узкую нишу. Идеальный САПР — это двусторонний — где легко из визуального проектирования получить скрипт, а из скрипта столь же легко получить визуальную модель. Моё мнение — лучше потратить силы на доработку FreeCAD до этого идеала, а не рыть ещё один параллельный туннель. Но силы ваши — вам виднее :-)
                0
                Думаю, как дополнение хорошо смотрелась бы популярная в 3д прогах «нодовая» система моделирования. Каждый узел соответствуют одной функции скрипта с соответствующими параметрами.
                  0
                  Мне это представление всегда казалось новомодным ненужным наворотом. Это как функциональные диаграммы и Verilog. Verilog явно более могучий.
                  Такое представление, конечно, можно сделать, хотя оно будет работать только до тех пор, пока мы не подтягиваем дополнительных библиотек. А фишка ZenCad как раз в интеграции с экосистемой python. Сделать можно… Только зачем? Нодовое представление — это такой костыль, который применяется интерактивным графическим кадом, чтобы добавить параметризуемость, не добавляя скрипты, потому-что скрипты нарушают красивое дерево модели. А zencad — это как бы сразу о скриптах…

                  В общем, имхо, лишнее это…

                  Кстати… Если уж на то пошло, evalcache, который занимается контролем ленивых вычислений в zencad умеет визуализировать дерево вычисления в консоли (Для отладочных целей). Так что задача нодового построения фактически решена. Хотя и не нужна на мой взгляд.
                    0
                    Я конечно даже поверхностно не владею текущим «раскладом» в области «CAD» систем, не знаком с целевой аудиторией на которую рассчитана описанная в статье система, но довольно давно наблюдаю за эволюцией некоторых популярных 3д редакторов. Могу отметить, что нодовые системы так или иначе проникают практически во все. Причина, имхо, в том, что скрипты и плагины способны писать настолько незначительное количество обычных пользователей, что ими можно пренебречь, а вот освоить пусть не столь универсальную, но все же довольно гибкую нодовую систему могут уже некоторые «продвинутые» пользователи. Т.е. если целевая аудитория состоит не из одних программистов, то нодовая система позволит существенно больше популяризовать продукт, снизив порог вхождения, но хозяин — барин. ) Тот же гудини имеет продвинутую систему и скриптов и нод, а их умелое сочетание позволяет получить результат быстрее, чем только скриптами.
                      0
                      Идея понятна.

                      Но думаю, это всё же не наш метод. Строго говоря, для zencad графический интерфейс — это что-то прикрученное сверху. Чем меньше обратных связей от gui к скрипту, тем прозрачнее работа системы.

                      Мне кажется, если человеку нужна нодовая система, он возьмёт Rhino или того же Houdini… И будет прав. Не зачем лезть в чужой огород.

                      zencad — это для программистов, которым понадобилось 3д.

                      В мануале даже девиз написан: CAD system for righteous zen programmers
                        0
                        zencad — это для программистов, которым понадобилось 3д.


                        Это хорошо сказано. Но я соглашусь с автором выше: нодовая структура проще скриптования, и потому доступнее. Мне нравится аналогия с html разметкой: есть декларативная нодная структура, понятная всем. Дальше поверх нее можно строить редакторы, в которых можно работать как визуально так и на уровне разметки. И вот это мне видится крутой фичей. Я сужу по себе, верстая xaml я могу буквально писать пространственные структуры. Это давно напрашивается в CAD.
                          0
                          Многие коментаторы этого поста говорят о том, как 3д модель удобно построить. ZenCad это немного о другом.

                          Я понял свою ошибку. Я сказал слово САПР. И понеслась. А ZenCad, это не САПР… Или, точнее, его можно использовать как САПР, но это не его цель. ZenCad — это библиотека 3д моделирования для экосистемы питона. Когда я писал его API визуализации, я вдохновлялся matplotlib.

                          ZenCad, это помимо собрать на коленке под 3д печать поломавшийся держатель для душа… Это и без нас…

                          ZenCad — это о том, как взять результат аналитического решения из sympy и построить по нему поверхность без промежуточных экспорто-импортов… Или же о том, как тяп-ляп нарисовать клешню робота и быстренько провести полунатурное моделирование без интеграции с gazebo…

                          Не вижу я в этих кейсах нодовой модели…
                  0
                  Скажите, есть поддержка сборок, состоящих из нескольких деталей и ограничений/связей между ними, как это сделано в том же Inventor или SolidWorks? Этого сильно не хватало во FreeCAD (так-то есть, но кривое и сырое).
                    0
                    Ограничений связей как таковых нет. Для того, чтобы сделать сборку надо взять несколько тел и транслировать их в нужные места. Анализа перекрытия тел так же не производится.

                    Вообще, сборки в zencad — это просто визуализация нескольких невзаимодействующих тел на одной сцене.

                    Связи как таковые тут не нужны, потому что вы все равно не сможете переместить тело мышкой по сцене. Локация жестко определена скриптом. Концепт не тот…
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Можно задействовать решатели уравнений из scipy, numpy, sympy.
                      0
                      Можно ли уточнить…
                      В оперскад сфера с fn=300 (насколько я понимаю, это 300 треугольников по диаметру) обрабатывается довольно долго. Увеличение до 400-500 делает вылет программы. При большом размере сферы 300 треугольников маловато будет для обработки на фрезерном станке. Видны переходы (на 3д принтере этих переходов не видно, разрешение не то).

                      В описанной выше программе, как с этим? Можно ли увеличить количество треугольников в stl модели?
                        0
                        Отличный вопрос.
                        Надо начать с того, что zencad оперирует с граничным представлением. То есть до момента конвертации в STL меш сети нет, а есть аналитическая сферическая поверхность.

                        При конвертации в STL (Через графический интерфейс, или же при использовании api) система предлагает выбрать параметр delta, который влияет на разрешение конечной модели (Вообще у opencascade больше параметров. Со временем они будут добавлены). Как конкретно этот параметр влияет, надо смотреть в документации на opencascade, но точно можно сказать, что чем он меньше тем больше точность.

                        Я протестировал openscad и zencad на обыкновенной сфере. Длина stl файла для zencad при delta==0.001 превышает длину файла stl для openscad при fn=300. Следовательно точность можно сделать выше. С другой стороны, время генерации файлов практически одинаковое.

                        Преимущество zencad здесь как раз в том, что zencad строит меш сеть только в момент конвертации, в то время как openscad проводит булевы операции прямо над полигональной сетью. Поэтому чем больше разрешение, тем больше требуется вычислительных ресурсов. В zencad операции вычисления модели и построения сети развязаны. Можно даже построить модель в zencad, экспортировать ее во freecad, после чего сгенирировать там мешсеть так, как это необходимо.
                        0
                        Отличная работа. Увидел аналог своих начинаний в прошлом. За язык я взял тогда c#, и считаю это лучше питона: строгая типизация, MS VS — отличная IDE со всеми мыслимыми плюшками. За геометрический движок я взял SolidWorks API. Кто-то скажет «там же итак есть api на сишарп». Есть, но волосы от него дыбом. Целью было сделать не просто тул для генерации геометрий из сишарпа, а хороший internal DSL в функциональном стиле. Поигравшись немного я понял что это тупик… В лучшем случае можно сделать хороший c# api поверх убогого api. Проблема в том, что теряется связь с визуальной частью, там где напрямую можно выбрать какой то элемент геометрии. В вашем случае те же проблемы. Питон обертку вы сделали. Она может даже сама по себе имеет ценность, для любителей питона. Дальше, линейные скрипты, до if ветвлений — по сути и есть декларативная разметка. Если есть двустороння связь с визуальной частью — отлично. Если нет — снова имеем только просто некий api на питоне.

                        В целом направление хорошее, надо работать. Хорошо что взяли готовое геометрическое ядро… Для сборок, кстати, есть solvespace.
                          0
                          От части метод ближайшей точки, рефлексия, и макросы решают задачу выбора элемента геометрии. Вообще, я уделяю много внимания этой проблеме. Это действительно принципиальное слабое место любого скриптового када.

                          П.С. C#… VS… Что-то это как-то слишком сложненько.
                            0
                            мне всегда казалось что строгая типизация проще, потому что не дает совершать ошибок банальных. плюс лучшая работа интелисенса. вместо VS есть VS Code сейчас… в общем конечно вопрос вкуса
                              0
                              Но это значит, что сначала вы компилируете exe, который затем строит модель… Зачем так сложно?
                                0
                                ну и что. OpenScad пошел по пути своего языка, своего редактора,… вы правильно пишите в статье — зачем это делать когда есть питон (сишарп в моем случае). Только я еще больше отсекаю лишнюю работу: зачем редакторы, IDE. Одному человеку написать этот функционал? сума сошли?.. Билдить сишарп на клиенте не проблема. Проблема создать максимально комфортное окружение.
                                  0
                                  Мне кажется, sublime text прекрасен в качестве редактора, что для openscad, что для zencad. vscode тоже неплох. Но VS — это как-то черезчур…
                                    0
                                    Ну как вам сказать… Вы же тоже для людей имеющих отношение к коду делали эту вещь. Я, например, весьма избалован прелестями IDE. Вряд ли какой то sublime text сранивнится с IDE, я уже не говорю про плюшки от Jetbrains. Я бы хотел тул где буквально пишут модель. Отсюда следует что почти все фичи при написании кода применимы и к процессу написания модели. Рефакторинги те же — если имеете дело с кодом то неизбежны и рефаторинги. Мне не очень было интересно создать какую то независимую вещь. Интереснее обкатать воркфлоу, на максимальной комфортности. Вам же важнее сделать законченное что то. Это тоже правильно.
                                      0
                                      Ну, пожалуй да… Просто я, что IDE, что IntelliJ сотоварищи на дух не переношу :)… Мне пожалуйста текстовый редактор и терминал…
                                    0
                                    Как и в Openscad, в ZenCad встроенный редактор имеет роль «на подхвате». Предполагается, что что пользователь пользуется внешним редактором.
                            0

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


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


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

                              0
                              Можно ли с созданной моделью сделать что-то полезное помимо преобразования в STL для отправки на 3D-принтер? Есть ли шанс, что в будущем можно будет создавать чертежи по модели? Можно ли как-то отображать размеры на трехмерной модели?
                                0
                                На текущий момент кроме конвертации в stl есть конвертация в brep с возможностью экспорта во freecad (он в чертежи, кажется, умеет). Возможно будет построение сечений (мне их нехватает), но полноценных чертежей тут ждать не стоит (если они и будут, то в виде какой-то надстройки сверху и очень нескоро. Я ими заниматься совершенно нехочу, потому как мне они совершенно не нужны).

                                Отображение размеров в виде размерных стрелочек сейчас тоже нет. В принципе, сами примитивы для их создания можно добавить (надписи есть, линии есть), но это в любом случае будет не автоматическая простановка. Каждую стрелочку придется ручками прописывать в код. Фишка сомнительной полезности.
                                  0
                                  Мне кажется, что создание стрелок с размерами, привязанными к конкретным точкам — это была бы полезная вещь, чтобы сразу видеть, не поехали ли какие-то размеры в процессе изменения модели. То, что их придется проставлять руками — понятно, и в этом нет ничего страшного.
                                    0
                                    Я подумаю в этом направлении. Вероятно, это не сложно сделать.
                                0
                                Для тех, кто следит за темой.
                                Не могу не поделиться этой видюшкой :):

                                Это, конечно, вообще не основное назначение zencad, но такое тоже можно.


                                P.S. Версия zencad 1.0 постепенно выходит на финишную прямую. Месяца через два-три, полагаю, можно будет торжественно объявить релиз.
                                  0
                                  Проект живой?
                                    0

                                    Живой, живой… Я, правда, немного отвлекся на моделирование динамики… Хотя это побочная ветка :)...

                                  0
                                  отличный проект! я, будучи приверженцем OpenSCAD и алгоритмического CAD проектирования, очень воодушевился прямо :)

                                  Для тех, кто испытывает трудности с инсталляцией: ставьте с предыдущей версией PyQT5 (5.14.0). В последней есть баг bugs.launchpad.net/rapid/+bug/1859124
                                  python3 -m pip install zencad pyqt5==5.14.0

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

                                  Самое читаемое