---
title: "Интерфейс макроэлемента (ksMacro3DDefinition, IMacro3DDefinition)"
type: interface
api: [api7]
domain: [3d, 2d]
tags: [interface, api7, 3d, 2d, ksmacro3ddefinition]
sources:
  - ksmacro3ddefinition.html
---

*API интерфейсов. Версия 5 > Документ-модель (Интерфейсы - ksDocument3D, IDocument3D )  > Компонент сборки (деталь или подсборка). Интерфейсы ksPart и IPart  > Объект модели (Интерфейсы ksEntity и IEntity)  > Интерфейсы ksEntity и iEntity - Интерфейс элемента модели (оси, плоскости, формообразующего элемента)  > Интерфейсы поверхностей *


## Интерфейс макроэлемента (ksMacro3DDefinition, IMacro3DDefinition)

Интерфейс макроэлемента документа-модели.
| ksMacro3DDefinition | - интерфейс Automation |
| --- | --- |
| IMacro3DDefinition | - интерфейс COM |
Описание:
Является 3D объектом, объединяющим в себе другие 3D объекты, в том числе и другие макроэлементы 3D, с возможностью скрывать свой состав, сохранять дополнительные пользовательские параметры и редактировать данный объект через библиотеку (если задано имя файла, имя библиотеки и команда редактирования).
Последовательность создания макроэлементов через API.
Создание макроэлемента с последующим добавлением объектов в его состав.
1. Создание пустого макроэлемента:
•Создание у компонента макроэлемента (ksPart::NewEntity соответствующего типа).
•Установка свойств макроэлемента (Видимость состава StaffVisible).
•Создание макро в модели ksEntity::Create.
•Установка пользовательских параметров SetUserParam.
2. Добавление существующих объектов в создаваемый макроэлемент:
•Добавление объектов в коллекцию объектов, входящих в макро ksFeatureCollection; при этом в модели ничего не происходит.
•Обновление макроэлемента ksEntity::Update; все новые объекты будут перенесены в макро в модели, у самих объектов тоже будут вызваны методы Update,
3. Создание новых объектов и добавление в макро:
•Создание нового объекта (NewEntity).
•Задание свойств нового объекта.
•Добавление объекта в коллекцию объектов, входящих в макро, при этом в модели ничего не происходит.
•Обновление макро ksEntity::Update - все новые, не созданные объекты, создадутся; у них вызовется ksEntity::Create.
Создание макроэлемента с одновременным наполнением его объектами.
•Создание у компонента макроэлемента (NewEntity соответствующего типа).
•Задание свойств макроэлемента.
•Создание при необходимости новых объектов (NewEntity) и задание их свойства (Create не вызывать), иначе переход к следующему пункту,
•Добавление объектов в коллекцию объектов, входящих в макро, в модели ничего не происходит,
•Создание макро в модели (ksEntity::Create) - все новые объекты создадутся, у них вызовется метод ksEntity::Create. Существующие объекты будут обновлены, у них вызовется метод ksEntity::Update.
4. Данный интерфейс можно получить, используя метод интерфейса элемента модели ksEntity::GetDefinition или IEntity::GetDefinition.


## Add - Добавить объект в состав макроэлемента

Синтаксис Automation:
```
BOOL Add (LPDISPATCH obj);
```
Синтаксис COM:
```
BOOL Add (LPUNKNOWN obj);
Входные параметры:
obj    - указатель на интерфейс объекта, добавляемого в макроэлемент.
Возвращаемое значение:
TRUE    - в случае успешного завершения,
FALSE    - в случае неудачи.
```
Примечание:
1. В качестве входного параметра могут быть переданы следующие интерфейсы:
•ksFeature,
•ksEntity,
•ksPart,
•ksMateConstraint.
2. Если объект еще не создан в модели, то он создастся после вызова методов ksEntity::Create или ksEntity::Update макроэлемента. Для существовавших объектов в этом случае будет вызван метод ksEntity::Update.
3. Добавляемый объект должен принадлежать тому же компоненту, что и сам макроэлемент. Он не должен принадлежать другому макроэлементу.
4. При добавлении тела в макроэлемент в макроэлемент добавляются все операции данного тела на момент создания макроэлемента. Само тело в макроэлемент не добавляется.


## ClearAllObj - Удалить все вспомогательные объекты, сохраненные в макро

Синтаксис Automation:
```
BOOL ClearAllObj();
```
Синтаксис COM:
```
BOOL ClearAllObj();
Возвращаемое значение:
TRUE    - в случае успешного завершения.
```
Примечания:
Объект - это вспомогательная информация, и визуально никак не отображается. Например, если создать болт как макро относительно какого-нибудь объекта (например отверстие - цилиндрическая поверхность), и запомнить это отверстие в макро болта, то при следующем редактирование можно получить сохранённый указатель на отверстие.


## Destroy - Разрушить макроэлемент

Синтаксис Automation:
```
BOOL Destroy();
```
Синтаксис COM:
```
BOOL Destroy();
Возвращаемое значение:
TRUE    - в случае успешного завершения,
FALSE    - в случае неудачи.
```
Примечание:
После вызова этого метода макроэлемент будет разрушен, а все объекты, входившие в его состав, станут самостоятельными.


## DoubleClickEditOff - Получить признак внешнего редактирования детали

Тип данных: BOOL
Синтаксис Automation:
```
off = iObj.DoubleClickEditOff    Получить свойство (* )
iObj.DoubleClickEditOff = off    Установить свойство(* )
off = iObj.GetDoubleClickEditOff()    Получить свойство (**)
iObj.SetDoubleClickEditOff (off)    Установить свойство (**)
```
Примечание:
Свойство позволяет для библиотечных элементов, имеющих макропараметры, оставить стандартное поведение компонента и объектов, входящих в состав компонента. Для этого нужно установить значение свойства равным TRUE.


## FeatureCollection - Получить массив объектов, входящих в макроэлемент

Синтаксис Automation:
```
LPDISPATCH FeatureCollection();
```
Синтаксис COM:
```
LPFEATURECOLLECTION FeatureCollection();
Возвращаемое значение:
- указатель на интерфейс ksFeatureCollection или IFeatureCollection
```
Примечание:
1. Через данную коллекцию можно добавлять только уже созданные объекты. Добавление новых (несозданных) объектов осуществляется при помощи метода ksMacro3DDefinition::Add.
2. Метод ksFeatureCollection::Refresh наполняет содержимое коллекции объектами, входящими в макроэлемент. Все изменения, сделанные в коллекции, после вызова этого метода будут потеряны.
3. При добавлении объектов в коллекцию добавляемый объект должен принадлежать тому же компоненту, что и сам макроэлемент; он не должен принадлежать другому макроэлементу.


## GetCountObj - Получить количество вспомогательных объектов, сохраненных в макро

Синтаксис Automation:
```
long GetCountObj();
```
Синтаксис COM:
```
long GetCountObj();
Возвращаемое значение:
- Количество вспомогательных объектов, сохранённых в макро.
```
Примечания:
Объект - это вспомогательная информация и визуально никак не отображается. Например, если создать болт как макро относительно какого-нибудь объекта (например отверстие - цилиндрическая поверхность), и запомнить это отверстие в макро болта, то при следующем редактирование можно получить сохранённый указатель на отверстие.


## GetObject - Получить указатель на вспомогательный объект, сохраненный в макро по индексу

Синтаксис Automation:
```
LPDISPATCH GetObject (long index);
```
Синтаксис COM:
```
LPUNKNOWN GetObject (long index);
Входные параметры:
index    - номер объекта.
Возвращаемое значение:
- Указатель на интерфейс IDispatch или IUnknown сохранённого объекта.
```
Примечания:
Объект - это вспомогательная информация, и визуально никак не отображается. Например, если создать болт как макро относительно какого-нибудь объекта (например отверстие - цилиндрическая поверхность), и запомнить это отверстие в макро болта, то при следующем редактирование можно получить сохранённый указатель на отверстие.
См. также: IMacro3DDefinition::SetObject


## GetUserLibraryCommand - Получить номер команды пользовательской библиотеки, при помощи которой можно редактировать макроэлемент

Интерфейс.
Аналог данного метода при использовании Automation - ksUserParam::number.
Пример...
Синтаксис COM:
```
long GetUserLibraryCommand();
Возвращаемое значение:
Номер библиотечной команды    - в случае успешного завершения,
-1    - если библиотеки нет.
```


## GetUserLibraryFileName - Получить имя файла пользовательской библиотеки, при помощи которой можно редактировать макроэлемент

Аналог данного метода при использовании Automation - ksUserParam::fileName.
Пример...
Синтаксис COM:
```
LPOLESTR GetUserLibraryFileName();
Возвращаемое значение:
Имя файла пользовательской библиотеки    - в случае успешного завершения,
NULL    - если имя файла библиотеки не задано.
```


## GetUserLibraryName - Получить имя пользовательской библиотеки, при помощи которой можно редактировать макроэлемент

Аналог данного метода при использовании Automation - ksUserParam::libName.
Пример....
Синтаксис COM:
```
LPOLESTR GetUserLibraryName();
Возвращаемое значение:
Имя пользовательской библиотеки    - в случае успешного завершения,
NULL    - если имя библиотеки не задано.
```


## GetUserParam - Получить параметры пользователя

Синтаксис Automation:
```
BOOL GetUserParam (LPDISPATCH userPars);
Выходные параметры:
userPars    - указатель на интерфейс пользовательских параметров ksUserParam.
```
Синтаксис COM:
```
BOOL GetUserParam (void *value,
unsigned int size);
Входные параметры:
value    - указатель на пользовательскую структуру параметров,
size    - размер структуры параметров.
Возвращаемое значение:
TRUE    - в случае успешного завершения,
FALSE    - в случае неудачи.
```
Примечание:
Способ получения пользовательских данных (userPars) должен совпадать со способом их сохранения (void*, SAFEARRAY, или DynamicArray) через ksMacro3DDefinition::SetUserParam.
– Если пользовательские данные были сохранены через SAFEARRAY (userPars), то перед их получением нужно создать SAFEARRAY соответствующего размера (размер данных можно определить при помощи ksMacro3DDefinition::GetUserParamSize).
– Если пользовательские данные были сохранены через ksUserParam::SetUserArray, то перед их получением нужно создать UserArray, аналогичный по структуре используемому при сохранении, и передать его в ksUserParam::SetUserArray.


## GetUserParamSize - Получить размер структуры параметров пользователя, хранимых в макроэлементе

Синтаксис Automation:
```
long GetUserParamSize();
```
Синтаксис COM:
```
long GetUserParamSize();
Возвращаемое значение:
- Размер структуры параметров пользователя, хранимых в макроэлементе в байтах.
```


## PropertyObjectEditable - Поддерживается интерфейс внешних свойств объекта

Тип данных: BOOL
Синтаксис Automation:
```
PropertyObjectEditable = Object.PropertyObjectEditable    Получить свойство (* )
Object.PropertyObjectEditable = PropertyObjectEditable    Установить свойство(* )
PropertyObjectEditable = Object.GetPropertyObjectEditable()    Получить свойство (**)
Object.SetPropertyObjectEditable( PropertyObjectEditable )    Установить свойство (**)
```


## SetObject - Сохранить указатель на объект в макро по индексу

Синтаксис Automation:
```
BOOL SetObject(long index, LPDISPATCH obj);
```
Синтаксис COM:
```
BOOL SetObject(long index, LPUNKNOWN obj);
Входные параметры:
index    - номер объекта,
obj    - указатель на интерфейс объекта.
Возвращаемое значение:
TRUE    - в случае успешного завершения,
FALSE    - в случае неудачи.
```
Примечания:
Объект - это вспомогательная информация, и визуально никак не отображается. Например, если создать болт как макро относительно какого-нибудь объекта (например отверстие - цилиндрическая поверхность), и запомнить это отверстие в макро болта, то при следующем редактирование можно получить сохранённый указатель на отверстие.
См. также: IMacro3DDefinition::GetObject


## SetUserParam - Установить параметры пользователя

Синтаксис Automation:
```
BOOL SetUserParam (LPDISPATCH userPars);
Входные параметры:
userPars    - указатель на интерфейс пользовательских параметров ksUserParam.
```
Синтаксис COM:
```
BOOL SetUserParam (void *value,
unsigned int size,
LPOLESTR nameFile,
LPOLESTR nameLib,
int number );
Входные параметры:
value    - указатель на пользовательскую структуру параметров,
size    - размер структуры параметров,
nameFile    - имя файла прикладной библиотеки для последующего редактирования через библиотеку (0 - запоминается текущая библиотека),
nameLib    - имя прикладной библиотеки для последующего редактирования через библиотеку (0 - запоминается текущая библиотека),
number    - номер команды в прикладной библиотеке для последующего редактирования через библиотеку (-1 - запоминается текущая команда).
Возвращаемое значение:
TRUE    - в случае успешного завершения,
FALSE    - в случае неудачи.
```
Примечания:
Данный метод позволяет сохранить параметры пользователя для последующего редактирования с помощью библиотеки.


## StaffVisible - Управление видимостью состава

Тип данных: BOOL
Синтаксис Automation:
```
staffVisible = iObject.StaffVisible    Получить свойство (* )
iObject.StaffVisible = staffVisible    Установить свойство(* )
staffVisible = iObject.GetStaffVisible()    Получить свойство (**)
iObject.SetStaffVisible (staffVisible)    Установить свойство (**)
```
Синтаксис COM:
```
staffVisible = iObject->GetStaffVisible()    Получить свойство
iObject->SetStaffVisible (&StaffVisible)    Установить свойство
Значение свойства:
TRUE    - состав объекта можно посмотреть в Дереве построения,
FALSE    - состав недоступен для просмотра.
```
Примечание:
Свойство позволяет управлять видимостью состава макроэлемента.
