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

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

```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>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://black1277.gitbook.io/python-for-cinema4d/text/create_cloner.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
