Та работа, которую я хочу представить вашему вниманию, есть попытка еще раз написать систему скриптового 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


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


Комментарии (46)


  1. DollaR84
    10.03.2019 14:37

    Очень интересная библиотека. Жаль, что под windows не работает. Очень бы хотелось попробовать, хотя бы для моделирования простых объектов, пусть даже без анимации.


    1. netricks Автор
      10.03.2019 14:48
      +2

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

      Вообще, изначально я собирался писать статью уже после проработки windows версии. Но там еще непочатый край работы, а лайки хочется собрать уже сейчас…


      1. DollaR84
        10.03.2019 14:58

        Большое спасибо за ваш труд, действительно интересно.
        P.S.: думаю за такую работу лайки не заставят себя ждать :)


      1. gshamshurin
        11.03.2019 07:35

        Понятно, что без windows версии широкого распространения пока ждать не приходится

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

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

        И да, плюсов Вам поставил :)


        1. netricks Автор
          11.03.2019 09:00

          Ну, это в первую очередь инструмент, которым пользуюсь я сам.
          Вон вчера краники на смесители напечатал :).


          1. Bookvarenko
            11.03.2019 22:04

            Есть ли возможность сделать экспорт в форматы, поддерживаемые движком Godot?


            1. netricks Автор
              11.03.2019 22:38

              Какие?


              1. Bookvarenko
                12.03.2019 08:28

                DAE, OBJ и GLTF 2.0


                1. netricks Автор
                  12.03.2019 14:53

                  Правильный ответ тут такой:
                  У нас есть открытый код freecad, который построен вокруг того же ядра. FreeCad позволяет экспорт в DAE и OBJ. Насчет GLTF я не понял.

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

                  Так что да. Возможность есть.


                  1. Bookvarenko
                    12.03.2019 15:43

                    Есть ли в в планах по развитию проекта реализация экспорта в эти форматы?


                    1. netricks Автор
                      12.03.2019 15:48

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


                      1. Bookvarenko
                        12.03.2019 17:36

                        Здорово!


  1. sah4ez32
    10.03.2019 16:41

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


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


    1. netricks Автор
      10.03.2019 16:59

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


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


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


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


    1. netricks Автор
      10.03.2019 17:02

      Вообще, сопряжения как таковые тут не прописываются.
      Всё делается за счет правильно расчитанных цепочек размеров. Этим же обеспечивается параметризуемость и перестраиваемость.


  1. Bookvarenko
    10.03.2019 22:17
    +1

    Интересный проект. Есть ли возможность записать и выложить небольшое ознакомительное видео?


    1. netricks Автор
      10.03.2019 23:03

      Мне эта идея в голову не приходила. Если найдётся время…


  1. Stepan555
    10.03.2019 22:38

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


    1. netricks Автор
      10.03.2019 23:28

      Правильный или неправильный, полноценный или неполноценный САПР, это уж как кому нравится. 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. Stepan555
        11.03.2019 14:35

        Вы со мной не согласитесь, но идея чисто скриптового САПРа изначально ориентирована на узкую нишу. Идеальный САПР — это двусторонний — где легко из визуального проектирования получить скрипт, а из скрипта столь же легко получить визуальную модель. Моё мнение — лучше потратить силы на доработку FreeCAD до этого идеала, а не рыть ещё один параллельный туннель. Но силы ваши — вам виднее :-)


  1. Emulyator
    10.03.2019 23:25

    Думаю, как дополнение хорошо смотрелась бы популярная в 3д прогах «нодовая» система моделирования. Каждый узел соответствуют одной функции скрипта с соответствующими параметрами.


    1. netricks Автор
      10.03.2019 23:35

      Мне это представление всегда казалось новомодным ненужным наворотом. Это как функциональные диаграммы и Verilog. Verilog явно более могучий.
      Такое представление, конечно, можно сделать, хотя оно будет работать только до тех пор, пока мы не подтягиваем дополнительных библиотек. А фишка ZenCad как раз в интеграции с экосистемой python. Сделать можно… Только зачем? Нодовое представление — это такой костыль, который применяется интерактивным графическим кадом, чтобы добавить параметризуемость, не добавляя скрипты, потому-что скрипты нарушают красивое дерево модели. А zencad — это как бы сразу о скриптах…

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

      Кстати… Если уж на то пошло, evalcache, который занимается контролем ленивых вычислений в zencad умеет визуализировать дерево вычисления в консоли (Для отладочных целей). Так что задача нодового построения фактически решена. Хотя и не нужна на мой взгляд.


      1. Emulyator
        11.03.2019 00:22

        Я конечно даже поверхностно не владею текущим «раскладом» в области «CAD» систем, не знаком с целевой аудиторией на которую рассчитана описанная в статье система, но довольно давно наблюдаю за эволюцией некоторых популярных 3д редакторов. Могу отметить, что нодовые системы так или иначе проникают практически во все. Причина, имхо, в том, что скрипты и плагины способны писать настолько незначительное количество обычных пользователей, что ими можно пренебречь, а вот освоить пусть не столь универсальную, но все же довольно гибкую нодовую систему могут уже некоторые «продвинутые» пользователи. Т.е. если целевая аудитория состоит не из одних программистов, то нодовая система позволит существенно больше популяризовать продукт, снизив порог вхождения, но хозяин — барин. ) Тот же гудини имеет продвинутую систему и скриптов и нод, а их умелое сочетание позволяет получить результат быстрее, чем только скриптами.


        1. netricks Автор
          11.03.2019 00:29

          Идея понятна.

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

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

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

          В мануале даже девиз написан: CAD system for righteous zen programmers


          1. aslepov78
            11.03.2019 12:17

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


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


            1. netricks Автор
              11.03.2019 18:12

              Многие коментаторы этого поста говорят о том, как 3д модель удобно построить. ZenCad это немного о другом.

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

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

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

              Не вижу я в этих кейсах нодовой модели…


  1. Alex_ME
    11.03.2019 00:46

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


    1. netricks Автор
      11.03.2019 00:53

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

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

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


    1. UnrealQW
      11.03.2019 01:26

      Можно провести все вычисления по привязке в скрипте (как вижу многотельные модели Зенкад поддерживает), хотя, например, построить окружность по 2-м точкам и прямой может быть непросто (но можно добавить в Зенкад встроенные функции).


      1. netricks Автор
        11.03.2019 01:32

        Можно задействовать решатели уравнений из scipy, numpy, sympy.


  1. Newm
    11.03.2019 12:17

    Можно ли уточнить…
    В оперскад сфера с fn=300 (насколько я понимаю, это 300 треугольников по диаметру) обрабатывается довольно долго. Увеличение до 400-500 делает вылет программы. При большом размере сферы 300 треугольников маловато будет для обработки на фрезерном станке. Видны переходы (на 3д принтере этих переходов не видно, разрешение не то).

    В описанной выше программе, как с этим? Можно ли увеличить количество треугольников в stl модели?


    1. netricks Автор
      11.03.2019 17:57

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

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

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

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


  1. aslepov78
    11.03.2019 12:36

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

    В целом направление хорошее, надо работать. Хорошо что взяли готовое геометрическое ядро… Для сборок, кстати, есть solvespace.


    1. netricks Автор
      11.03.2019 18:16

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

      П.С. C#… VS… Что-то это как-то слишком сложненько.


      1. aslepov78
        11.03.2019 18:20

        мне всегда казалось что строгая типизация проще, потому что не дает совершать ошибок банальных. плюс лучшая работа интелисенса. вместо VS есть VS Code сейчас… в общем конечно вопрос вкуса


        1. netricks Автор
          11.03.2019 18:23

          Но это значит, что сначала вы компилируете exe, который затем строит модель… Зачем так сложно?


          1. aslepov78
            11.03.2019 18:28

            ну и что. OpenScad пошел по пути своего языка, своего редактора,… вы правильно пишите в статье — зачем это делать когда есть питон (сишарп в моем случае). Только я еще больше отсекаю лишнюю работу: зачем редакторы, IDE. Одному человеку написать этот функционал? сума сошли?.. Билдить сишарп на клиенте не проблема. Проблема создать максимально комфортное окружение.


            1. netricks Автор
              11.03.2019 18:34

              Мне кажется, sublime text прекрасен в качестве редактора, что для openscad, что для zencad. vscode тоже неплох. Но VS — это как-то черезчур…


              1. aslepov78
                11.03.2019 18:40

                Ну как вам сказать… Вы же тоже для людей имеющих отношение к коду делали эту вещь. Я, например, весьма избалован прелестями IDE. Вряд ли какой то sublime text сранивнится с IDE, я уже не говорю про плюшки от Jetbrains. Я бы хотел тул где буквально пишут модель. Отсюда следует что почти все фичи при написании кода применимы и к процессу написания модели. Рефакторинги те же — если имеете дело с кодом то неизбежны и рефаторинги. Мне не очень было интересно создать какую то независимую вещь. Интереснее обкатать воркфлоу, на максимальной комфортности. Вам же важнее сделать законченное что то. Это тоже правильно.


                1. netricks Автор
                  11.03.2019 18:44

                  Ну, пожалуй да… Просто я, что IDE, что IntelliJ сотоварищи на дух не переношу :)… Мне пожалуйста текстовый редактор и терминал…


            1. netricks Автор
              11.03.2019 18:36

              Как и в Openscad, в ZenCad встроенный редактор имеет роль «на подхвате». Предполагается, что что пользователь пользуется внешним редактором.


  1. vitalijlysanov
    11.03.2019 18:23

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


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


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


  1. Jenyay
    11.03.2019 20:42

    Можно ли с созданной моделью сделать что-то полезное помимо преобразования в STL для отправки на 3D-принтер? Есть ли шанс, что в будущем можно будет создавать чертежи по модели? Можно ли как-то отображать размеры на трехмерной модели?


    1. netricks Автор
      11.03.2019 20:52

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

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


      1. Jenyay
        11.03.2019 20:58

        Мне кажется, что создание стрелок с размерами, привязанными к конкретным точкам — это была бы полезная вещь, чтобы сразу видеть, не поехали ли какие-то размеры в процессе изменения модели. То, что их придется проставлять руками — понятно, и в этом нет ничего страшного.


        1. netricks Автор
          11.03.2019 21:06

          Я подумаю в этом направлении. Вероятно, это не сложно сделать.