Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Разноцветные модели #39

Open
oleg-medovikov opened this issue Jan 29, 2020 · 18 comments
Open

Разноцветные модели #39

oleg-medovikov opened this issue Jan 29, 2020 · 18 comments

Comments

@oleg-medovikov
Copy link

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

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

def element1():
     return m
def element2():
    return m

def model(x,y,z):
    disp(element1().translate(x,y,z),color())
    disp(element2().translate(x,y,z),color())


model(1,2,3)
@mirmik
Copy link
Owner

mirmik commented Jan 29, 2020

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

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

Пример:

#!/usr/bin/env python3
#coding: utf-8

from zencad import *
import zencad.assemble

a=box(10)
b=box(10).moveX(10)

u = zencad.assemble.unit()
u.add_shape(a, color.red)
u.add_shape(b, color.blue)

u.relocate(moveZ(10) * rotateZ(deg(45)))

disp(u)
show()

@oleg-medovikov
Copy link
Author

Именно то, что я и хотел.
Спасибо.

@oleg-medovikov
Copy link
Author

https://github.com/oleg-medovikov/zencad

вот результат, если интересно.
это arduino + CNC shield v3
с достаточно точными размерами

@mirmik
Copy link
Owner

mirmik commented Feb 21, 2020

Могу я скриншоты этой и другой вашей модели (которая дельта робот) использовать как иллюстрации в будущей статье про zencad?

Уж больно они хороши.

@oleg-medovikov
Copy link
Author

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

screenshot-2020-02-22-08:47:18

@oleg-medovikov
Copy link
Author

Долго добивался, чтобы при изменении радиуса базы, оно правильно раздвигалось.
screenshot-2020-02-02-15:32:16
screenshot-2020-02-02-15:32:40
screenshot-2020-02-02-15:55:06

В жизни оно вот так выглядит
BfEa0KfrWqc
sv5M9dJQzrk

@mirmik
Copy link
Owner

mirmik commented Feb 22, 2020

Капитальненько...

@mirmik mirmik closed this as completed Feb 29, 2020
@oleg-medovikov
Copy link
Author

Рано закрыл тему.
Вот такая проблема:
Есть у меня assemble.unit и я хочу несколько раз использовать его в сцене.
Я планировал делать

relocate(1 место)
disp()
relocate(2 место)
disp()
...

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

def extrans(): return multitransform([
    translate(0,-rad-45,27) * rotateZ(deg(-90)) * rotateY(deg(165)),
    translate(0,-rad,-70),
    nulltrans()
])

disp(extrans(konchevik))

Выводит ошибку:

TypeError: extrans() takes 0 positional arguments but 1 was given

@mirmik mirmik reopened this Feb 29, 2020
@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

Единицей отображения в zencad - является интерактивный объект (interactive_object).
Функция disp создаёт интерактивный объект и связывает его с дефолтной сценой.

#!/usr/bin/env python3
#coding: utf-8

from zencad import *

m=box(10)

interactive0 = disp(m)
interactive1 = disp(m)

interactive0.relocate(up(20))
interactive1.relocate(rotateZ(deg(45)))

show()

Интерактивные объекты перемещаются независимо от породившей их геометрии.

zencad.assemble.unit - это по сути сложная обёртка над интерактивными объектами. Она позволяет их стыковать между собой, перемещать группами или относительно друг друга, но логика над ними та же самая. Один юнит, одно отображение на сцене. Если хотите, чтобы юнит отображался два раза, создайте два юнита.

По exttrans. У вас extrans - это функция, возвращающая объект множественного преобразования, но не выполняющая его. Поэтому правильный синтаксис:

extrans()(konchevik)

Вероятно, название функции disp/display немного вводит в заблуждение относительно того, что она на самом деле делает.

@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

Мне нужно капитально обновить мануал на эту тему...

P.S. нужно будет добавить юнитам и интерактивным объектам возможность копирования.

@oleg-medovikov
Copy link
Author

def extrans(): return multitransform([
    translate(0,-rad-45,27) * rotateZ(deg(-90)) * rotateY(deg(165)),
    translate(0,-rad,-70),
    nulltrans()
])

extrans()(konchevik)

у меня так не получается

@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

А кочевник это unit? Увы, юниты и интерактивные объекты пока перемещаются только через relocate. Дать им для совместимости также возможности, что и shape-ам в планах.

@oleg-medovikov
Copy link
Author

kon1 = konchevik
kon2 = konchevik
kon1.relocate( translate(0,-rad-45,27) * rotateZ(deg(-90)) * rotateY(deg(165)))
kon2.relocate( translate(0,-rad+20,-40))
disp(kon2)
disp(kon1)

Ну вот делаю вот так, а отображается только последний.

@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

У вас kon1 и kon2 - это один и тот же объект. Вы его перенесли сначала на одну позицию, потом на другую, потом дважды вызвали для него disp. Поскольку disp видит, что это уже объект отображения, он первый раз биндит его в сцену, а во второй раз вообще ничего не делает.

@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

Увы, но придётся создавать второго кочевника.

@mirmik
Copy link
Owner

mirmik commented Feb 29, 2020

def make_kochevnik():
    u = zencad.assemble.unit()
    u.add_shape(shp0)
    u.add_shape(shp1, color=color.red)
    return u

Koch0=make_kochevnik()
koch1=make_kochevnik()

@oleg-medovikov
Copy link
Author

Это не кочевник, а концевик. Просто требовалось разместить 6 штук в проекте и метод multitrans выглядит очень симпатично, с точки зрения кода. В одном месте описаны координаты каждого.

screenshot-2020-03-01-21:54:13

@mirmik
Copy link
Owner

mirmik commented Mar 1, 2020

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

Через какое-то время станет работать ожидаемым образом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants