• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Программным способом указать компонент для операции объединения

Автор Misha, 28.10.10, 15:19:54

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Misha

Доброго времени суток! Кто-нибудь сталкивался с такой задачей: при объединении всех элементов сборки в одну деталь нужно указать на компоненты вручную. Каким способом можно указать на компоненты программным способом, что бы они добавились в списке компонентов? Спасибо.

ksUnionComponentsDefinition,
IUnionComponentsDefinition


Справка системы КОМПАС...

Интерфейс операции объединения компонентов.

ksUnionComponentsDefinition
- интерфейс Automation

IUnionComponentsDefinition
- интерфейс COM


Примечания.

1. Позволяет создать объединение двух или более деталей, входящих в сборку в новой или уже существующей детали.

2. Операция доступна в режиме редактирования детали в контексте сборки.

3. Для входа в режим редактирования детали в контексте сборки используется функция ksPart::BeginEdit.

4. В операции объединения могут участвовать только детали. Объединить деталь с подсборкой невозможно.

5. При необходимости вы можете скрыть или исключить из расчета детали, объединением которых является новая деталь.

6. Данный интерфейс можно получить, используя метод интерфейса элемента модели ksEntity::GetDefinition или IEntity::GetDefinition.


IParts7

Интерфейс коллекции компонентов 3D документа.

Примечание:

1. Данный интерфейс можно получить от интерфейса IPart7, используя свойство IPart7::Parts.

2. Данный интерфейс можно получить от интерфейса IModelObjects, используя метод IUnknown QueryInterface.

3. От интерфейса 3D-документа IKompasDocument3D может быть получен верхний компонент IKompasDocument3D::TopPart, а от полученного верхнего компонента IPart7 может быть получена коллекция компонентов IParts7 с помощью свойства IPart7::Parts. Элементы коллекции-компоненты могут быть получены у коллекции с помощью свойства IParts7::Part. Либо с помощью свойства IModelObjects::Item как объекты типа IModelObject с последующим приведением к типу IPart7 через QueryInterface. От каждого элемента коллекции-компонента может быть получена вложенная коллекция компонентов c помощью свойства IPart7::Parts. И так далее, пока имеются вложенные коллекции компонентов.


Misha

А можно немного поподробней? Может кусок кода или алгоритм. А то что-то не понятно.

Цитата: Misha от 02.11.10, 12:45:30
А можно немного поподробней? Может кусок кода или алгоритм. А то что-то не понятно.

Может дадите свой кусок кода, где Вам, что-то не понятно.

Misha

  #region Создать деталь в сборке
            ksPart part = (ksPart)doc.GetPart(0); // первая деталь в сборке
            ksEntityCollection collect = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_planeXOY);
            ksEntity plane = (ksEntity)collect.GetByIndex(0);
            ksPart newPart = (ksPart)doc.CreatePartInAssembly("Assemble.m3d", plane);
            #endregion



            part = (ksPart)doc.GetPart(4); // первая деталь в сборке

            newPart.BeginEdit();

            ksEntity planeXOY = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);   // 1-интерфейс на плоскость XOY
            ksEntity entity = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            //ksEntityCollection entityCollection = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_sketch);
            ksUnionComponentsDefinition unionComponentsDefinition = (ksUnionComponentsDefinition)entity.GetDefinition();

1. Создаю деталь в сборке
2. начинаю BeginEdit
3. хочу получить интерфейс ksUnionComponentsDefinition и не полчается

Цитата: Misha от 04.11.10, 11:00:00
 
1. Создаю деталь в сборке
2. начинаю BeginEdit
3. хочу получить интерфейс ksUnionComponentsDefinition и не полчается

1. Пытаюсь создать деталь в сборке
2. начинаю BeginEdit, но не заканчиваю.
3. Несуществующий эскиз не есть тело.
4. Объединить можно хотя бы две вещи.

Misha

Поправьте, пожалуйста, если неправильно мыслю.
Получается, чтобы выполнить операцию объединения надо:
1. Создать деталь в сборке
2. Войти в режим BeginEdit этой детали
3. Создать эскиз
4. А дальше не понимаю:
Надо добавить необходимые для объединения детали в созданную деталь ?

            IPart7 NewPart7 = (IPart7)kompas.TransferInterface(part, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
            IModelObject mObj = (IModelObject)kompas.TransferInterface(entityXOY, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
!!!       NewPart7.Parts.AddFromFile(classDetail[0].m3dFile, true, true); - ошибка, т.к. Parts - null

где NewPart7 - это созданная деталь.


Цитата: Misha от 05.11.10, 14:08:49
Поправьте, пожалуйста, если неправильно мыслю.
Получается, чтобы выполнить операцию объединения надо:
1. Создать деталь в сборке
2. Войти в режим BeginEdit этой детали
3. Создать эскиз
4. А дальше не понимаю:
Надо добавить необходимые для объединения детали в созданную деталь ?

            IPart7 NewPart7 = (IPart7)kompas.TransferInterface(part, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
            IModelObject mObj = (IModelObject)kompas.TransferInterface(entityXOY, (int)Kompas6Constants.ksAPITypeEnum.ksAPI7Dual, 0);
!!!       NewPart7.Parts.AddFromFile(classDetail[0].m3dFile, true, true); - ошибка, т.к. Parts - null

где NewPart7 - это созданная деталь.


1. Создать пустую сборку
2. Создать реальную деталь отдельно от сборки
3. вставить деталь в сборку вставить еще раз сместив точку привязки так, чтобы детали пресекались
P.S. Сделайте в компасе в ручную и поймете последовательность в коде.
Parts-Имеет только сборка в детали nil (не проверял когда деталь состоит из частей)

Misha

я так и делаю, но дальше, что бы создать операцию объединения, нужно создать пустую деталь. А потом войти в режим BeginEdit и будет доступна операция объединить компоненты. Вручную все получается, а программным способом не удается получить интерфейс ksUnionComponentsDefinitionейс.

chelkar

Цитата: Misha от 05.11.10, 14:08:49
Получается, чтобы выполнить операцию объединения надо:
1. Создать деталь в сборке
2. Войти в режим BeginEdit этой детали
3. Создать эскиз
Если Вы ничего не путаете и нужно именно объединение компонентов, то:
- 1 и 2 правильно,
- 3 (создавать эскиз) не нужно
- создайте newEntity с типом o3d_UnionComponents
- возьмите у нее Definition
- заполните массив компонентов ksUnionComponentsDefinition::PartArray
и апдейт на нее

Misha