> For the complete documentation index, see [llms.txt](https://black1277.gitbook.io/python-for-cinema4d/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://black1277.gitbook.io/python-for-cinema4d/text/create_cloner.md).

# Как создать клонер

Чтобы создать любой объект используемый для сцены нужно воспользоваться таким кодом:

```python
obj = c4d.BaseObject(ID)
```

где ID - представляет из себя номер идендификатора нужного объекта. Номерам наиболее часто используемых объектов сопоставлены константы:

* Ocube 5159
* Onull 5140
* Oplane 5168
* Osphere 5160

и т.д. Список этих констант можно найти в [документации](https://developers.maxon.net/docs/py/23_110/types/objects.html). Таким образом мы можем создать, например примитив куба, либо написав так:

```python
cube = c4d.BaseObject(5159)
```

либо так:

```python
cube = c4d.BaseObject(c4d.Ocube)
```

Однако, в документации перечислены не все возможные объекты. Как раз клонера там и нету... В таком случае, есть обходной путь. В самой Cinema 4D включаем команду "Протокол скрипта" (находится там же где и менеджер скриптов) - теперь каждое действие в редакторе будет сопровождаться отображением примерно такой команды:

```python
c4d.CallCommand(300000116) # Протокол скрипта...
```

![изображение протокола скрипта](/files/mrUCnzpeGXCGS53UHV5P)

Создаем клонер на сцене через меню редактора и наблюдаем в протоколе скрипта:

```python
c4d.CallCommand(1018544) # Клон
```

Вот эта цифра 1018544 и есть нужный нам номер, который позволит создать клонер в коде:

```python
cloner = c4d.BaseObject(1018544)
```

Далее созданный объект можно поместить в сцену:

```python
cloner.SetName('сloner') # дадим своё название в менеджере объектов
doc.InsertObject(cloner) # добавили клонер в документ

# Обновляем сцену после добавления новых объектов
c4d.EventAdd()
```

Важное примечание: таким образом можно создавать только объекты помещаемые в сцену. Другие объекты, например слои в менеджере слоев, нужно создавать по другому, хотя сама команда c4d.CallCommand(ID) может быть использована.

Перед тем как добавить клонер на сцену можно настроить параметры клона:

```python
# тип клонера - линейный
cloner[c4d.ID_MG_MOTIONGENERATOR_MODE]=c4d.ID_MG_MOTIONGENERATOR_MODE_LINEAR
```

где константа c4d.ID\_MG\_MOTIONGENERATOR\_MODE\_LINEAR может быть заменена обычным числом 1 . Названия констант можно смотреть в [документации](https://developers.maxon.net/docs/py/23_110/classic_resource/object/obasemogen.html) или просто заменять их числами. Так следущее число 2 сделает тип клона радиальным и т.д.

Чтобы узнать как изменить соответствующий атрибут объекта(клонера) нужно найти его в менеджере атрибутов, выделить название атрибута щелчком левой кнопки мыши, а затем перетащить это название в редактор скриптов или консоль. В том месте куда перетащили название атрибута появится в квадратных скобках имя константы через которую надо обратится к соответвующему параметру объекта. К примеру, у линейного клонера есть атрибут количество, перетащив его в редактор увидим название `cloner[c4d.MG_LINEAR_COUNT]` Используем это:

```python
cloner[c4d.MG_LINEAR_COUNT]=7 # количество клонов будет 7
```

![изображение атрибутов клонера](/files/7ycJtMRayqsvao2JG0tE)

Перед тем как в коде назначать параметрам свои значения полезно заглянуть в [документацию](https://developers.maxon.net/docs/py/23_110/classic_resource/object/mglineararray.html), чтобы не ошибиться с типом значения. Или просто распечатать через print:

```python
print(cloner[c4d.MG_LINEAR_OBJECT_POSITION])
# Распечатает Vector(0, 50, 0)
```

Зададим смещение каждому следующему объекту в линии. Это можно сделать двумя способами. Первый:

```python
cloner[c4d.MG_LINEAR_OBJECT_POSITION] = c4d.Vector(50, 0, 0)
# задаем сразу три значения по порядку - x,y,z
```

Второй:

```python
cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X] = 50 # зададим смещение по x
cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Y] = 0 # лучше явно обнулить на случай если
cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Z] = 0 # там было значение по умолчанию
```

Вот полный код скрипта:

```python
import c4d

def main():
    cube = c4d.BaseObject(c4d.Ocube)
    # устанавливаем стороны для куба по 45
    cube[c4d.PRIM_CUBE_LEN] = c4d.Vector(45.,45., 45.)
    cloner = c4d.BaseObject(1018544)
    cloner.SetName('сloner')
    cloner[c4d.ID_MG_MOTIONGENERATOR_MODE]=1
    cloner[c4d.MG_LINEAR_COUNT]=7
    cloner[c4d.MG_LINEAR_OBJECT_POSITION] = c4d.Vector(50, 0, 0)
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X] = 50
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Y] = 0
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Z] = 0
    cube.InsertUnder(cloner)# подчиняем куб клонеру
    doc.InsertObject(cloner) # добавили клонер в документ
    # Обновляем сцену после добавления новых объектов
    c4d.EventAdd()

if __name__=='__main__':
    main()
```

<details>

<summary>Cinema4D R23 - Python объекты выраженные в константах</summary>

[Ссылка на Gist](https://gist.github.com/black1277/6a75cb4c2a616dfae5fe939a5ec5eeb0)

</details>

{% embed url="<https://gist.github.com/black1277/6a75cb4c2a616dfae5fe939a5ec5eeb0>" %}
